当分配器感知容器获得 copied/moved 时,反弹分配器是否获得 copied/moved?
Do rebound allocators get copied/moved when an allocator aware container gets copied/moved?
这个问题与其说是一个实际问题,不如说是一个好奇心。
在 C++ 中,许多容器是 "noded based"。这意味着对于存储,他们不能真的使用传递给他们的分配器,相反,他们会做类似的事情:
typedef typename A::template rebind<node>::other node_allocator_type
并且大概会像这样或类似地创建这种类型的成员:
node_allocator_type node_allocator;
创建一个可以分配节点的分配器。太好了,这一切都说得通,但我有一个问题,如果容器确实 "allocator aware",支持有状态分配器,那么在容器 copy/move 期间会发生什么。
节点分配器是否也得到 copied/moved?这在表面层面上是有意义的,但是当我们点击一个 copy/move 构造函数时会发生什么,用户可以在其中指定一个新的分配器?
list( const list& other, const Allocator& alloc );
list( list&& other, const Allocator& alloc );
在这种情况下,other
的分配器不会被复制或移动,因此新构建的列表会得到一个全新的 node_allocator
以及 copied/moved alloc
?
这显然是一个实现细节,但我很好奇什么是 "right" 以及典型的实现是做什么的。我还认识到 C++11 之前的状态分配器没有得到很好的支持,因此这不是问题。
假设复制构造分配器(甚至有状态分配器)是一种廉价操作;如果他们有任何相关资源,他们 should be held by reference. Furthermore rebound allocators may be constructed by copy, and these compare equal to the original allocator; see a == b
in Cpp17Allocator requirements.
这样做的结果是容器可以完全自由地存储 Allocator
、Allocator::rebind<void>
或 Allocator::rebind<node_type>
,并根据需要在它们之间进行复制转换在分配节点时,在移动构造时,在 get_allocator()
的 (prvalue!) return 等上。例如,通常是 libstdc++ stores 和 Allocator::rebind<node_type>
。
这个问题与其说是一个实际问题,不如说是一个好奇心。
在 C++ 中,许多容器是 "noded based"。这意味着对于存储,他们不能真的使用传递给他们的分配器,相反,他们会做类似的事情:
typedef typename A::template rebind<node>::other node_allocator_type
并且大概会像这样或类似地创建这种类型的成员:
node_allocator_type node_allocator;
创建一个可以分配节点的分配器。太好了,这一切都说得通,但我有一个问题,如果容器确实 "allocator aware",支持有状态分配器,那么在容器 copy/move 期间会发生什么。
节点分配器是否也得到 copied/moved?这在表面层面上是有意义的,但是当我们点击一个 copy/move 构造函数时会发生什么,用户可以在其中指定一个新的分配器?
list( const list& other, const Allocator& alloc );
list( list&& other, const Allocator& alloc );
在这种情况下,other
的分配器不会被复制或移动,因此新构建的列表会得到一个全新的 node_allocator
以及 copied/moved alloc
?
这显然是一个实现细节,但我很好奇什么是 "right" 以及典型的实现是做什么的。我还认识到 C++11 之前的状态分配器没有得到很好的支持,因此这不是问题。
假设复制构造分配器(甚至有状态分配器)是一种廉价操作;如果他们有任何相关资源,他们 should be held by reference. Furthermore rebound allocators may be constructed by copy, and these compare equal to the original allocator; see a == b
in Cpp17Allocator requirements.
这样做的结果是容器可以完全自由地存储 Allocator
、Allocator::rebind<void>
或 Allocator::rebind<node_type>
,并根据需要在它们之间进行复制转换在分配节点时,在移动构造时,在 get_allocator()
的 (prvalue!) return 等上。例如,通常是 libstdc++ stores 和 Allocator::rebind<node_type>
。