为什么std :: allocator是模板?

时间:2017-07-23 16:18:46

标签: c++

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

2 个答案:

答案 0 :(得分:16)

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

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

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

现在第一点大多已经过时了,尽管它可以与第二点一起使用,在共享内存段或文件中有一个映射地址不变容器。

第二点可以用来利用专门的分配器,虽然接口并不是那么好用。我将其用于hack me a secure std::basic_string的示例。

最后一点很少使用。

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

答案 1 :(得分:7)

考虑到了对齐。不同类型具有不同的对齐要求,对char数组有用的内存位置可能不适合double(通常需要8字节对齐的地址)。

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