gpt4 book ai didi

c++ - 包含原子的类的 std::vector

转载 作者:行者123 更新时间:2023-11-27 23:46:18 32 4
gpt4 key购买 nike

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

我试过几种:

  • 如果没有指定拷贝构造函数,编译器会报错构造函数被删除。

如果指定了复制构造函数,我尝试了两种方法:

  • 对于 foo(foo& other) 它将提示没有找到 foo 的复制构造函数。

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

  • 使用 foo(const foo& other) 会提示 std::atomic 没有常量复制构造函数。

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

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

最佳答案

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

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

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

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

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

关于c++ - 包含原子的类的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331210/

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