普通变量通常是从寄存器读取的,编译器可能会将普通变量存储在寄存器中以加快访问速度。
volatile关键字告诉编译器不要对该变量进行优化,每次访问该变量都要从内存中读取,以确保变量的可见性和一致性。因此,volatile变量会从内存中读取。
std::atomic
用在并发编程中,对访问特殊内存没用。volatile
用于访问特殊内存,对并发编程没用。
编译器看到这个,
int x;
auto y = x;
y = x;
x = 10;
x = 20;
会优化为:
auto y = x; //概念上会读x(见下)
x = 20; //写x
但是对于volatile类型的x就不会被优化掉。
atomic会限制编译器对代码进行重新排序,而volatile不会。
更详细的解释请参考: