为什么STL保留分配器的接口

  • 本文关键字:分配器 接口 保留 STL c++
  • 更新时间 :
  • 英文 :


为什么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_stringstd::char_traits

最新更新