std::包含原子的类的向量

std::vector of class containing atomic

本文关键字:向量 原子的 包含 std      更新时间:2023-10-16

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

我已经尝试了几种:

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

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

使用 Foo
  • (Foo& Other(,它会抱怨没有找到 Foo 的复制构造函数。

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

  • 使用 FOO(const Foo& other(,它会抱怨 std::atomic 没有 const copy 构造函数。

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

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

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

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

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

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

您应该(甚至可以(使用其中哪一个取决于您的类实际执行的操作。