gpt4 book ai didi

c++ - 当分配器感知容器被复制/移动时,反弹分配器是否被复制/移动?

转载 作者:行者123 更新时间:2023-12-04 13:39:24 25 4
gpt4 key购买 nike

这个问题与其说是实际问题,不如说是好奇。

在 C++ 中,许多容器都是“基于节点的”。这意味着对于存储,他们不能真正使用传递给他们的分配器,相反,他们会做类似的事情:

typedef typename A::template rebind<node>::other node_allocator_type

并且可能会像这样或类似地创建这种类型的成员:

node_allocator_type node_allocator;

创建一个可以分配节点的分配器。太好了,这一切都说得通,但我有一个问题,如果容器真正“感知分配器”并支持有状态分配器,那么在复制/移动容器期间会发生什么。

节点分配器是否也被复制/移动?这在表面层面上是有意义的,但是当我们点击一​​个复制/移动构造函数时会发生什么,用户可以在其中指定一个新的分配器?

list( const list& other, const Allocator& alloc );
list( list&& other, const Allocator& alloc );

在这种情况下,other 的分配器没有被复制或移动,因此新构建的列表在复制/移动的同时获得了一个全新的 node_allocator 分配?

这显然是一个实现细节,但我很好奇什么是“正确的”以及典型的实现是做什么的。我还认识到 C++11 之前的状态分配器没有得到很好的支持,因此这不是问题。

最佳答案

假设复制构造分配器(甚至有状态分配器)是一种廉价操作;如果他们有任何相关资源,他们会 should be held by reference .此外,反弹分配器可以通过拷贝构造,并且这些分配器与原始分配器比较相等;见 a == bCpp17Allocator requirements .

这样做的结果是容器完全可以自由存储Allocator。 , 一个 Allocator::rebind<void> ,或 Allocator::rebind<node_type> ,并在分配节点时根据需要在它们之间进行复制转换,在移动构造时,在(prvalue!)从get_allocator()返回时等 一般libstdc++ stores一个Allocator::rebind<node_type> ,例如。

关于c++ - 当分配器感知容器被复制/移动时,反弹分配器是否被复制/移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60325083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com