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

时间:2015-01-29 16:47:17

标签: c++ c++11 atomic

假设我有一个结构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会比指针解除引用更快?

2 个答案:

答案 0 :(得分:2)

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

然而,因为std :: atomic(很可能,但取决于你的架构)是有用的,因为通过原子成员函数汇集所有访问的方式,而不是因为任何使其成为原子的额外成员数据,复制它可能等同于复制int,如果你不需要引用语义,它可能确实更快,因为解引用内存相对较慢。正如评论中所提到的,您必须定义复制它以满足您的需求意味着什么。

答案 1 :(得分:0)

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

在您的情况下,问题是通过执行obj.ae = raw_ae;您不是要尝试更改引用,而是为 obj.ae 的当前引用分配新值。由于std::atomic被声明为不可复制的类,因此您得到了适当的编译器错误。

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