大家好,又见面了,我是你们的朋友全栈君。
volatile的作用
volatile关键字是防止在共享的空间发生读取的错误。只保证其可见性,不保证原子性;使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化。
在单任务环境中,如果在两次读取变量之间不改变变量的值,编译器就会发生优化,会将RAM中的值赋值到寄存器中;由于访问寄存器的效率要高于RAM,所以在需要读取变量时,直接寄存器中获取变量的值,而不是从RAM中。
在多任务环境中,虽然在两次读取变量之间不改变变量的值,在一些情况下变量的值还是会发生改变,比如在发生中断程序或者有其他的线程。这时候如果编译器优化,依旧从寄存器中获取变量的值,修改的值就得不到及时的相应(在RAM还未将新的值赋值给寄存器,就已经获取到寄存器的值)。
代码语言:javascript复制#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
int i=10;
int a=i;
cout<<a<<endl;
_asm
{
mov dword ptr [ebp-4],80
}
int b=i;
cout<<b<<endl;
}
输出结果:
10 10
注:必须在Release版本在,在Release才会对代码进行优化
要想防止编译器优化,就需要在声明变量i时前加volatile关键字,就会输出 10 80;加关键字后,就在RAM中读取变量的值,而不是直接在寄存器中取值
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138439.html原文链接:https://javaforall.cn