volatile关键字

volatile的本意是“易变的”。由于访问寄存器要比访问内存单元快的多,因此编译器通常都会做减小存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统老是从新从它所在的内存读取数据,即便它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就再也不进行优化,从而能够提供对特殊地址的稳定访问;若是不使用volatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以避免出错)。
在某个函数中定义的变量可能在函数外面被改变的状况,你就应该加上volatile,保证每次都必须从内存中读取数据,而不能重复使用放在cache或寄存器中的备份。
举个例子:ide

int a = 1;
a = 2;
a = 3;

此时运行程序,编译器优化性的读代码,变为:函数

int a = 1;
a = 3;

这意味着a = 2这一条指令就丢失了。而当你加上volatile关键字,代码在编译后仍是三条:优化

volatile int a = 1;
a = 2;
a = 3;

因此说,简而言之,volatile关键字的做用,就是让编译器始终从内存读取数据,以防止因优化带来的错误。code

相关文章
相关标签/搜索