复制包含原子成员的对象的地址?

Copying addresses of objects containing an atomic member?

假设我有一个结构 AtomicElement:

struct AtomicElement{
    std::atomic<int32_t> a;
};

我还有另一个 class、Object,其中包含对上述 AtomicElement 对象之一的引用:

struct Object{
    AtomicElement& ae;
};

现在在别处我有这些 AtomicElement 对象的矢量,我想更新 Object::ae 以指向不同的矢量元素:

std::vector<AtomicElement> aeVector(AtomicElement());
Object obj;
.
.
//Obtain the address to the new element
AtomicElement& raw_ae = aeVector[i];
.
.
//Change to point to the new element
obj.ae = raw_ae;  //Cannot get this part to compile.

我做错了什么?

我的AtomicElement只有32位,我应该按值使用吗?

我想尽可能以最有效的方式完成此操作,并尽可能减少复制。

编辑:

32 位 int 实际上表示两个 16 位数字,原子性是这样的值更新....原子地。 我想知道我是否最好定义一个复制构造函数,因为复制 32 位 int 会比指针取消引用更快?

您不能重新分配引用,但可以使用指针。 (会发表评论但没有代表。)

然而,由于 std::atomic 很有用(很可能,但取决于您的体系结构),因为 它通过原子成员函数汇集所有访问的方式,而不是由于任何 额外成员数据 使它成为原子,复制它可能等同于复制一个 int,如果你不需要引用语义,它可能确实更快,因为取消引用内存比较慢。如评论中所述,您必须定义复制它的含义以满足您的需求。

Type & value = reference;Type * const value = &reference的相似度越来越低,而要设置一个值则需要分别通过value = Type()*value = Type()来设置。事实上,一旦定义,您不能以两种方式更改引用的地址,并且必须在它们的声明中定义它们。

在您的情况下,问题是通过执行 obj.ae = raw_ae; 您并不是要更改引用,而是要为 obj.ae[ 的当前引用分配一个新值=25=]。由于 std::atomic 被声明为不可复制的 class,您遇到了相应的编译器错误。

如果您需要能够切换到另一个引用,则必须改用指针。