为什么 std::分配器是一个模板?

Why is std::allocator a template?

本文关键字:一个 std 分配器 为什么      更新时间:2023-10-16

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

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

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

最后,分配器感知容器可以与分配器结合使用,利用它为子元素提供子分配器,这可能有助于减少开销。


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

第二点可用于利用专门的分配器,尽管界面对此并不好。一个例子,我用它来破解我一个安全std::basic_string

最后一点很少使用。


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

对齐浮现在脑海中。不同的类型有不同的对齐要求,适合char数组的内存位置可能不适合double(通常需要 8 字节对齐地址(。

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

相关文章: