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