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

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

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

int a = 1;a = 3;

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

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

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

©著作权归作者所有:来自51CTO博客作者wx5cb188ffabeef的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 示例演示:数据类型的转换和检测技术、变量与常量的方式以及使用
  2. php学习笔记(函数相关_作用域_闭包_回调_多指返回)
  3. 细解php函数
  4. 你应该知道的7 个 JavaScript 原生错误类型
  5. 在 React 中缩放、裁剪和缩放图像
  6. PHP函数作用域、闭包及函数多值返回
  7. 0125-php与html混编的方式与短标签的使用及php数据类型
  8. 检查 JavaScript 变量是否为数字的几种方式
  9. PHP基础知识:变量类型检测和转换以及常量和预定义变量

随机推荐

  1. HTML5做的web网页可以直接做成手机APP么?
  2. 使用xpath查找包含特定内容的span
  3. Jquery在两个元素之间更改文本
  4. 通过PHP隐藏SQL中的索引值
  5. 纯JS幻灯片菜单,能够“点击菜单外点击”
  6. 为什么我的DIV小于其内容?
  7. 高分求:如何解析IdHTTP获得的http代码?用ms
  8. 用无序列表键入文本脚本
  9. 如何通过z-index覆盖一个div
  10. 主滑块调整大小到行容器