为什么在构造函数中使用分配器
why allocator in constructor?
向量定义为
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巨大*等(。然后,您不能使用引用,因为对于不同的内存模型,您具有不同的引用类型。对图书馆产生了巨大的影响。- 亚历克斯·斯捷潘诺夫
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 是否允许分配器构造和销毁成员函数从内部逻辑引发异常?
- C++ 如何在容器类复制构造函数中复制分配器对象
- 没有用于初始化我的自定义分配器的匹配构造函数
- 在分配器感知类调用复制构造函数中对向量元素的引用
- uninitialized_X使用分配器构造函数的函数
- 在C++容器中,作为模板参数提供的分配器和作为构造函数参数提供的分配程序之间的区别
- 为什么 g++ 不支持在 Ubuntu 上使用分配器构造函数?
- 构造函数在哪里获取/设置默认分配器
- 使用分配器unordered_map非默认构造函数
- 为什么 std 类型不提供来自分配器不同源的转换构造函数/赋值
- 为什么在构造函数中使用分配器
- 使用自定义分配器调用对象构造函数/析构函数
- 为什么c++中的分配器需要复制构造函数
- STL分配器复制构造函数需求的目的是什么?