复制包含原子成员的对象的地址
Copying addresses of objects containing an atomic member?
假设我有一个结构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
被声明为不可复制的类,因此您遇到了相应的编译器错误。
如果需要能够切换到另一个引用,则必须改用指针。
- 空基优化子对象的地址
- 对象地址是否保证是其类型对齐的倍数
- 更改保留指向其字段的原始指针的对象地址
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 尝试将派生类对象地址分配给基类指针的向量
- 如果类型相同,对象地址必须不同,但如果类型不同,地址可以相同
- 使用对象地址以及方法地址和签名调用C 成员函数
- 将派生的对象地址分配给基础指针和调用击路仪的机制
- 为什么写入临时字符串流对象只打印对象地址
- 依赖静态对象地址安全吗
- 获取引用指向的对象地址
- 传递对象地址时"Address expression must be an lvalue or a function designator"
- 在C++中存储对象地址的数据结构
- 从函数初始化对象地址
- 使用reintepret_cast解释对象地址
- 为什么基类指针总是指向基类,即使它持有派生类对象地址
- 是否可以将堆栈对象地址赋给placement new
- <<运算符重载不起作用;仍在打印对象地址
- 关于返回对象地址的困惑