std::vector 个,共 class 个,包含原子
std::vector of class containing atomic
我正在尝试创建一个包含 class 实例的向量,而 class 又包含(除其他外)std::atomic.
我试过几个:
- 如果没有指定拷贝构造函数,编译器会报错构造函数被删除
如果指定了复制构造函数,我尝试了两种方法:
with foo(foo& other) 它会抱怨找不到 foo 的复制构造函数。
编辑:复制构造函数是 foo(foo& other) : atomic(other.atomic.load()) {}
with foo(const foo& other) 它会抱怨 std::atomic.
没有常量复制构造函数
编辑:复制构造函数是 foo(const foo& other) : atomic(other.atomic.load()) {}
我完全不知道如何解决这个问题,所以非常感谢您的帮助
根据设计,std::atomic
既不可复制也不可移动。对 std::vector
进行重新分配的操作要求其元素至少是可移动的。因此,您有以下选择:
- 停止在元素 class 中存储
std::atomic
。也许可以使用 std::unique_ptr<std::atomic>
代替。
- 停止将元素 class 直接存储在向量中,而是存储
std::unique_ptr<ElementClass>
(正如@Richard Critten 在评论中所建议的那样)。
- 为您的 class 编写复制或移动构造函数和赋值运算符,这将以某种方式解决
std::atomic
. 的不可移动性问题
给你的 class 虚拟 copy/move 操作来满足编译器。然后,使用 reserve
在 vector 中预分配 space,然后仅使用追加元素(直到预分配的大小)、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。
鉴于这种方法的脆弱性,我建议采取两种预防措施:
- 让假人投掷,以便您尽快发现任何违反 "no resizing" 要求的行为。
- 不要直接使用
std::vector
,而是将其包装在您自己的 NonResizableVector<T>
中并适当限制接口,并大量记录。
你应该(甚至可以)使用其中的哪一个取决于你的 class 实际做了什么。
我正在尝试创建一个包含 class 实例的向量,而 class 又包含(除其他外)std::atomic.
我试过几个:
- 如果没有指定拷贝构造函数,编译器会报错构造函数被删除
如果指定了复制构造函数,我尝试了两种方法:
with foo(foo& other) 它会抱怨找不到 foo 的复制构造函数。
编辑:复制构造函数是 foo(foo& other) : atomic(other.atomic.load()) {}
with foo(const foo& other) 它会抱怨 std::atomic.
没有常量复制构造函数编辑:复制构造函数是 foo(const foo& other) : atomic(other.atomic.load()) {}
我完全不知道如何解决这个问题,所以非常感谢您的帮助
std::atomic
既不可复制也不可移动。对 std::vector
进行重新分配的操作要求其元素至少是可移动的。因此,您有以下选择:
- 停止在元素 class 中存储
std::atomic
。也许可以使用std::unique_ptr<std::atomic>
代替。 - 停止将元素 class 直接存储在向量中,而是存储
std::unique_ptr<ElementClass>
(正如@Richard Critten 在评论中所建议的那样)。 - 为您的 class 编写复制或移动构造函数和赋值运算符,这将以某种方式解决
std::atomic
. 的不可移动性问题
给你的 class 虚拟 copy/move 操作来满足编译器。然后,使用
reserve
在 vector 中预分配 space,然后仅使用追加元素(直到预分配的大小)、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。鉴于这种方法的脆弱性,我建议采取两种预防措施:
- 让假人投掷,以便您尽快发现任何违反 "no resizing" 要求的行为。
- 不要直接使用
std::vector
,而是将其包装在您自己的NonResizableVector<T>
中并适当限制接口,并大量记录。
你应该(甚至可以)使用其中的哪一个取决于你的 class 实际做了什么。