volatile 关键字是一种类型修饰符,和 const 对应,用来修饰变量。用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
声明时语法:int volatile vInt = 100;
有一些激进的编译器会对代码进行优化,比如说之前声明了一个i,从内存中读入i 进入寄存器之后,先把i赋值给a,一段时间又把i赋值给b。如果编译器发现在ab之间没有对i进行操作,那么会直接把a的数据给b,而不是从i里面读。 volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。这样以来,如果 i是一个寄存器变量或者表示一个端口数据就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问。
下面通过插入汇编代码,测试有无 volatile 关键字,对程序最终代码的影响:
输入下面的代码: