为什么STL会为Allocator保留一个接口?

时间:2018-02-16 13:58:14

标签: c++

为什么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等?

2 个答案:

答案 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