C语⾔中volatile的作⽤和使⽤⽅法
  在程序设计中,尤其是在C语⾔、C++、C#和Java语⾔中,使⽤volatile关键字声明的变量或对象通常具有与优化、多线程相关的特殊属性。
通常,volatile关键字⽤来阻⽌(伪)编译器认为的⽆法“被代码本⾝”改变的代码(变量/对象)进⾏优化。如在C语⾔中,volatile关键字可以⽤
来提醒编译器它后⾯所定义的变量随时有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使⽤寄存器中的值,如果这个变量由别的程序更新了的话,将出现不⼀致的现象。
  举个栗⼦:
在这⾥例⼦中,代码将foo的值设置为0。然后开始不断地它的值直到它变成255:
c语言编译器的功能static int foo;
void bar(void) {
foo = 0;
while (foo != 255)
;
}
⼀个会提⽰没有代码能修改foo的值,并假设它永远都只会是0.因此编译器将⽤类似下列的替换函数体:
void bar_optimized(void) {
foo = 0;
while (true)
;
}
但是,foo可能指向⼀个随时都能被计算机系统其他部分修改的地址,例如⼀个连接到的设备的,上⾯的代码永远检测
不到这样的修改。如果不使⽤volatile关键字,编译器将假设当前程序是系统中唯⼀能改变这个值部分(这是到⽬前为⽌最⼴泛的⼀种情况)。
为了阻⽌编译器像上⾯那样优化代码,需要使⽤volatile关键字:
static volatile int foo;
void bar (void) {
foo = 0;
while (foo != 255)
;
}
这样修改以后循环条件就不会被优化掉,当值改变的时候系统将会检测到。
  总结:
  优点:防⽌编译器对代码优化,变量值是直接从变量地址中读取和存储的。
  缺点:这种使⽤过多会导致代码⼗分庞⼤。
  参考⽂档: /wiki/Volatile%E5%8F%98%E9%87%8F