std :: list对其allocator参数做了什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: list对其allocator参数做了什么?相关的知识,希望对你有一定的参考价值。
std::list
由分配器类型参数化,它可能会重新绑定以分配列表节点而不是T
s。那么它对传递给构造函数的allocator类型的对象有什么作用呢?
template <class T, class Alloc = std::allocator<T>>
class list
{
class node { ... T element; ... };
using real_alloc =
typename std::allocator_traits<Alloc>::template rebind_alloc<node>;
real_alloc m_allocator;
public:
list(const Alloc&);
};
在上面的代码中,我们需要将m_allocator
初始化为节点分配器,但构造函数被赋予了T
分配器。我们只是把T
分配器放在地板上,还是以某种方式使用它?
答案
因为C++11
分配器可以是有状态的。您希望使用用户提供的内部分配器构建内部分配器。 Allocator显然需要从typename std::allocator_traits<Alloc>::template rebind_alloc<U>
构建。
列表构造函数的实现应如下所示:
template<class T, class Alloc>
class list
{
struct node_type {/*etc*/}; //internal
using allocator_type_internal = typename std::allocator_traits<Alloc>::template rebind_alloc<node_type>;
// etc.
allocator_type_internal m_allocator; //Note we use allocator_type, not Alloc.
};
list::list(const Alloc& alloc ) :
m_allocator(alloc)
{ /* initialize sentinel node, etc. */ }
虽然好的实现会对分配器使用空基优化。
另一答案
T
分配器仍然用于construct()
和destroy()
内部节点的T
部分。使用这些操作可能是在构造期间添加自定义参数所必需的,例如,可选地将合适的分配器参数转发给构造的对象。
以上是关于std :: list对其allocator参数做了什么?的主要内容,如果未能解决你的问题,请参考以下文章
错误:内存位置 0x0038fd50 处的 std::bad_alloc
StarRocks BE节点崩溃原因查找及解决思路:std::bad_alloc
多个文件的内存分配错误“在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用” [C ++]