为什么STL会为Allocator保留一个接口?
以shared_preload_libraries = 'repmgr'
为例:
vector
因为我们有很多选择来分配内存和构建像
的对象
template<class T,class Allocator = std::allocator<T>>
class vector;
,在我们创建对象时几乎可以做任何我们需要的事情
那么为什么像operator new,delete,new[],delete[]
这样的STL容器需要一个Allocator接口,如果我们不分配一个接口,那么它在大多数情况下是默认的vector
? 为什么不使用std::allocator
表达式?
如果目的是使用户定义的分配行为成为可能,为什么不让用户提供他们自定义的new
等?
答案 0 :(得分:10)
如此具体的向量并改变它的分配方式而不改变所有向量的分配方式。
new
必须基于您分配或全局替换的每种类型进行覆盖。 std::vector<int>
和std::vector<int, some_other_allocator>
可以使用不同的分配策略;实际上,分配器可以是有状态并且具有共享状态。
经典的一个是快速堆栈分配器,在它超出范围之前不会解除分配。
答案 1 :(得分:1)
例如std::list<T, Allocator>
也提供此接口。通常会告诉您不要使用链接列表,因为缓存位置不好。
如果您仍然需要使用链接列表,例如它永远不会使迭代器失效,您可以使用pool allocator
优化std::list
#include <boost/pool/pool_alloc.hpp>
template <typename T>
using pooled_list = std::list<T, boost::pool_allocator<T>>
这样您就可以优化代码而无需重新实现std::list
。这是policy based design的一个例子。另一个例子是std::char_traits
std::basic_string
。