为什么std :: allocator是模板?

ant*_*red 26 c++

分配器的工作是通过其allocate方法获得"原始"内存.调用者在分配器返回的内存中构造的内容与分配器无关(对吗?).那么为什么std::allocator这个模板似乎只会增加不必要的复杂性呢?分配器实际上对该类型信息做了什么?为什么必须知道内存所针对的对象类型?我假设有一些明显的原因让我失踪,那是什么原因?

Ded*_*tor 17

嗯,std::allocator和Allocator概念本身,是为了处理近点和远点等问题而发明的,或者通常是指向不同地址空间的指针.他们正确地处理了这个问题.分配器确定使用的指针类型.

它们也可以用来处理不同的内存分配器,尽管它的样板数量有点惊人.

最后,一个可识别分配器的容器可以与利用它的分配器相结合,为子元素提供子分配器,这可能有助于减少开销.


第一点现在大部分已经过时,但它可以与第二点一起使用,在共享内存段或文件中具有映射地址不变容器.

第二点可以用来利用专门的分配器,尽管接口并不是那么好用.我用它来破解我安全的std::basic_string一个例子.

最后一点很少使用.


定义的Allocator概念的一个巨大缺点是它使用模板的事实.所有的使用已经完成std::allocator_traits<Allocator>,所以它只会导致类型无意中几乎相同,如果没有分配器的模板参数.
还有很多重复的代码来适当地重新绑定分配器.


Mat*_*lia 7

想到了对齐.不同类型具有不同的对齐要求,对于char阵列有益的存储器位置可能不适合于a double(通常需要8字节对齐的地址).

OTOH,应该注意的是,malloc通过为最严格的内置类型提供正确对齐的存储器来解决这个问题,这对于通用分配器来说通常是足够好的解决方案.

  • 有道理.`std :: allocator`似乎是一系列不幸事件的产物 (4认同)
  • 我没有发现足够令人信服的论证,如果需要对齐,对齐本身应该是参数,即`allocator <alignof(T)>` (2认同)