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

标签 c++ vector copy atomic copy-constructor

我正在尝试创建一个包含类实例的 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/

相关文章:

c++ - vector 中的方括号

C++ 类 - 如何从函数返回自定义类型的 vector ?

listview - WPF ListView GridView 复制到剪贴板

java - 深度克隆 Java 对象(不是 bean)

C++ - 结构指针数组

c++ - 通过指针进行最快可移植访问的 c/c++ 数据类型?

c++ - 使用 gdb : "Could not find the frame base", 进行调试失败,但使用 lldb 进行调试

c++ - 读/写简单 BMP 图像 C++

matlab - MATLAB 中的函数矩阵向量化

android - 如何检测 "copy to clipboard"事件