为什么在构造函数中使用分配器

why allocator in constructor?

本文关键字:分配器 构造函数 为什么      更新时间:2023-10-16

向量定义为

template < class T, class Alloc = allocator<T> > class vector;

每个向量构造函数(或每种类型的一个重载(都有一个分配器重载,默认构造函数也有一个。类模板中已指定分配器。构造函数分配器的用途是什么?

从 http://www.cplusplus.com/reference/vector/vector/vector/

default (1) 
explicit vector (const allocator_type& alloc = allocator_type());
fill (2)    
explicit vector (size_type n);
         vector (size_type n, const value_type& val,
                 const allocator_type& alloc = allocator_type());
range (3)   
template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());
copy (4)    
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);
move (5)    
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);
initializer list (6)    
vector (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());

模板括号中的参数是分配器的类型(类(。 构造函数的参数是该类型的实例。

根据1995年3月出版的《Dr. Dobb's Journal》上对Alex Stepanov的采访,分配器是需要适应不同记忆模型的结果。用 86 位代码寻址 x16 内存相当奇怪,您可以使用 5 种不同的内存模型来做到这一点。

人们想要独立于记忆模型的容器,这有点过分,因为语言不包括记忆模型。人们希望库提供一些抽象内存模型的机制。早期版本的 STL 假定容器的大小可以表示为 size_t 类型的整数,并且两个迭代器之间的距离是 ptrdiff_t 类型。现在我们被告知,你为什么不从中抽象出来呢?这是一项艰巨的任务,因为语言不会从中抽象出来;C 和 C++ 数组不由这些类型参数化。我们发明了一种称为"分配器"的机制,它封装了有关内存模型的信息。这对库中的每个组件都造成了严重后果。您可能想知道内存模型与算法或容器接口有什么关系。如果你不能使用像size_t这样的东西,你也不能使用像T*这样的东西,因为不同的指针类型(T*,T巨大*等(。然后,您不能使用引用,因为对于不同的内存模型,您具有不同的引用类型。对图书馆产生了巨大的影响。- 亚历克斯·斯捷潘诺夫