Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问c+中未初始化的原子私有变量+;_C++_Stdatomic - Fatal编程技术网

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

C++ 访问c+中未初始化的原子私有变量+;,c++,stdatomic,C++,Stdatomic,假设我有以下课程: class A { public: ... ... void incrementN() {++n_;} uint64_t getN() {return n_;} private: std::atomic<uint64_t> n_; ... ... }; A类 { 公众: ... ... void incrementN(){++n} uint64_t getN(){返回n_;} 私人: std::原子n_; ... ... }; 假设我初始化了类中除n\uu

假设我有以下课程:

class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}

private:
std::atomic<uint64_t> n_;
...
...

};
A类
{
公众:
...
...
void incrementN(){++n}
uint64_t getN(){返回n_;}
私人:
std::原子n_;
...
...
};
假设我初始化了类中除
n\uu
之外的所有其他变量,并且这不是线程本地存储,因此没有零初始化

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


如果在某个时刻我需要
n
的值,并且我调用
getN()
,这会导致原子
n
load()
例程崩溃吗?

默认情况下,加载使用内存顺序。请参见此处:


正如在评论中提到的,它不应该给您带来任何普通ints无法解决的问题。如果未初始化的初始值较大,您是否担心溢出?请参见此处了解可能的后果:

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


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

您是否有
a
默认构造函数,或者有任何
a
构造函数?如果没有任何构造函数或默认构造函数(
a()=default;
),则编译器生成的默认构造函数将调用所有非静态成员的默认构造函数(),并将调用。是的,我有一个,它初始化A的其他变量,但不初始化
n_
@JoachimPileborg n_u是默认初始化的,对象是构造的,它的值是未指定的,所以它不是UB。是的,这是真的,我理解未定义的行为本质上可以允许任何奇怪的事件发生。然而,是否有一个特定的大纲,通过它我可以在尝试访问
n_u
时获得SEGV?我不认为这比任何其他未初始化值的读取都要少。原子学在这方面没有什么特别之处。