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

Copying addresses of objects containing an atomic member?

本文关键字:对象 地址 成员 包含原 复制      更新时间:2023-10-16

假设我有一个结构AtomicElement

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

我还有另一个类,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 的当前引用。由于std::atomic被声明为不可复制的类,因此您遇到了相应的编译器错误。

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