在 c++ 中访问未初始化的原子私有变量

Accessing uninitialized atomic private variable in c++

本文关键字:变量 初始化 c++ 访问      更新时间:2023-10-16

假设我有以下类:

class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}
private:
std::atomic<uint64_t> n_;
...
...
};

假设我初始化了类中的所有其他变量,除了n_,并且这不是线程本地存储,因此没有零初始化。

我创建了一个类 A 的对象,并不断调用 incrementN()

如果在某个时候我想要n_的值,并且我调用getN(),这会导致原子n_load()例程崩溃吗?

默认情况下

,负载使用memory_order_seq_cst。看这里:http://en.cppreference.com/w/cpp/atomic/memory_order。

正如评论中提到的,它不应该给你任何普通整数不会给你的问题。您是否担心如果未初始化的初始值很大,溢出?有关可能的后果,请参阅此处:https://www.owasp.org/index.php/Integer_overflow

n_成员变量只是未初始化。访问该字段将导致读取内存,并且没有理由崩溃,尽管该 8 字节内存的布局未知。

成员是原子的事实在这里并不重要。这将导致编译器不对此特定变量使用任何优化,还可能导致每次写入时缓存行逐出到 RAM。