简单地说就是防止编译器对代码进行优化.好比以下程序:
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XBYTE[2]=0x58;
对外部硬件而言,上述四条语句分别表示不一样的操做,会产生四种不一样的动做,可是编译器却会对上述四条语句进行优化,认为只有XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。若是键入volatile,则编译器会逐一的进行编译并产生相应的机器代码(产生四条代码).程序员
2、volatile 的含义
volatile老是与优化有关,编译器有一种技术叫作数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果能够用于常量合并,常量传播等优化,进一步能够死代码消除。但有时这些优化不是程序所须要的,这时能够用volatile关键字禁止作这些优化,volatile的字面含义是易变的,它有下面的做用:
1 不会在两个操做之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其余的程序改变,编译器本身没法知道,volatile就是告诉编译器这种状况。
2 不作常量合并、常量传播等优化,因此像下面的代码:
volatile int i = 1;
if (i > 0) ...
if的条件不会看成无条件真。
3 对volatile变量的读写不会被优化掉。若是你对一个变量赋值但后面没用到,编译器经常能够省略那个赋值操做,然而对Memory Mapped IO的处理是不能这样优化的。<