包含原子的类的 std::vector

Zer*_*30o 1 c++ copy vector atomic copy-constructor

我正在尝试创建一个包含类实例的向量,该类实例又包含(除其他外)std::atomic。

我已经尝试过以下几种:

  • 如果没有指定复制构造函数,编译器将给出构造函数被删除的错误。

如果指定了复制构造函数,我尝试了两件事:

  • 对于 foo(foo& other) ,它会抱怨没有找到 foo 的复制构造函数。

    编辑:复制构造函数是 foo(foo& other) :atomic(other.atomic.load()) {}

  • 对于 foo(const foo& other) ,它会抱怨 std::atomic 没有 const 复制构造函数。

    编辑:复制构造函数是 foo(const foo& other) :atomic(other.atomic.load()) {}

我完全不知道如何解决这个问题,所以非常感谢任何帮助

Rei*_*ica 5

std::atomic根据设计,不可复制或可移动。导致其重新分配的操作std::vector要求其元素至少是可移动的。因此,您有以下选择:

  • 停止存储std::atomic在元素类中。也许std::unique_ptr<std::atomic>可以用 a 代替。
  • 停止将元素类直接存储在向量中,std::unique_ptr<ElementClass>而是存储(如 @Richard Critten 在评论中建议的那样)。
  • 为您的类编写一个复制或移动构造函数和赋值运算符,这将以某种方式解决std::atomic.
  • 为您的类提供虚拟复制/移动操作以满足编译器的要求。然后,使用 预先分配向量中的空间reserve,然后仅使用附加元素(最多达到预先分配的大小)、访问它们或从末尾删除的函数;没有中间插入或删除。这样,虚拟操作将永远不会被实际调用。

    鉴于这种方法的脆弱性,我建议采取两项预防措施:

    1. 让假人投掷,以便您尽快发现任何违反“禁止调整大小”要求的行为。
    2. 不要std::vector直接使用,而是NonResizableVector<T>使用适当限制的接口将其包装在您自己的中,并对其进行大量记录。

您应该(甚至可以)使用其中哪一个取决于您的班级实际做什么。