为什么STL保留分配器接口?以vector
为例:
template<class T,class Allocator = std::allocator<T>>
class vector;
由于我们有很多选择可以分配内存和构造
之类的对象 operator new,delete,new[],delete[]
,它几乎可以在创建对象时需要我们需要的任何事情。
那么,为什么像vector
这样的STL容器需要分配器接口,如果我们不放置一个,则最多在哪个默认的std::allocator
?为什么不使用new
表达式?
如果目的是使用户定义的分配行为成为可能,为什么不让用户提供其自定义的operator new,new[]
,等等?
因此,特定的向量并更改其分配的方式而不更改所有向量分配的方式。
new
必须以每种分配或全球替换的方式以每种方式覆盖。std::vector<int>
和std::vector<int, some_other_allocator>
可以使用不同的分配策略;实际上,分配器可以是状态,并且具有共享状态。
经典的是一个快速的堆栈分配器,直到范围范围都不到。
例如std::list<T, Allocator>
还提供了此接口。通常,您被告知由于较差的高速缓存局部性而不使用链接列表。
如果您仍然需要使用链接列表,因为它永远不会使迭代器无效,您可以通过使用池分配器
来优化std::list
#include <boost/pool/pool_alloc.hpp>
template <typename T>
using pooled_list = std::list<T, boost::pool_allocator<T>>
这样,您可以在不重新实现std::list
的情况下优化代码。这是基于策略设计的示例。另一个示例是std::basic_string
的std::char_traits
。