Professordeng's Blog

变量被 volatile 修饰,说明此变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了,简单地说就是防止编译器对代码进行优化。例如如下代码:

XBYTE[2] = 0x55;
XBYTE[2] = 0x56;
XBYTE[2] = 0x57;
XBYTE[2] = 0x58;

对外部硬件而言,上述四条语句分别表示不同的操作,会产生四种不同的动作,但是编译器却会对上述四条语句进行优化,认为只有 XBYTE[2]=0x58(即忽略前三条语句,只产生一条机器代码)。如果键入volatile,则编译器会逐一地进行编译并产生相应的机器代码(产生四条代码)。

对于 volatile 类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用 cache 当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化,显然也是因为它的数值随时都可能变化的情况。