分配器的工作是通过其allocate方法获得"原始"内存.调用者在分配器返回的内存中构造的内容与分配器无关(对吗?).那么为什么std::allocator这个模板似乎只会增加不必要的复杂性呢?分配器实际上对该类型信息做了什么?为什么必须知道内存所针对的对象类型?我假设有一些明显的原因让我失踪,那是什么原因?
Ded*_*tor 17
嗯,std::allocator和Allocator概念本身,是为了处理近点和远点等问题而发明的,或者通常是指向不同地址空间的指针.他们正确地处理了这个问题.分配器确定使用的指针类型.
它们也可以用来处理不同的内存分配器,尽管它的样板数量有点惊人.
最后,一个可识别分配器的容器可以与利用它的分配器相结合,为子元素提供子分配器,这可能有助于减少开销.
第一点现在大部分已经过时,但它可以与第二点一起使用,在共享内存段或文件中具有映射地址不变容器.
第二点可以用来利用专门的分配器,尽管接口并不是那么好用.我用它来破解我安全的std::basic_string一个例子.
最后一点很少使用.
定义的Allocator概念的一个巨大缺点是它使用模板的事实.所有的使用已经完成std::allocator_traits<Allocator>,所以它只会导致类型无意中几乎相同,如果没有分配器的模板参数.
还有很多重复的代码来适当地重新绑定分配器.
想到了对齐.不同类型具有不同的对齐要求,对于char阵列有益的存储器位置可能不适合于a double(通常需要8字节对齐的地址).
OTOH,应该注意的是,malloc通过为最严格的内置类型提供正确对齐的存储器来解决这个问题,这对于通用分配器来说通常是足够好的解决方案.