volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统,硬件或者其他线程等等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
下面例子:
int i = 10;
int j = i; // 语句1
int k = i; // 语句 2
此时,编译器对代码进行优化,这是因为,在1,2两句中,i没有被用作左值(没有被赋值)。这时候编译器认为i的值没有改变,所以在语句1时,从内存取出i的值付给j之后,这个值并没有被丢掉,而是在2语句中继续使用这个值给k赋值。编译器不会生成汇编代码重新从内存中取i的值(不会编译生成装载内存的汇编命令)。这样提高了效率,但要注意:1,2两句之间确认i没有被用作左值才行
volatile int i = 10;
int j = i; //语句3
int k = i; //语句4
volatile关键字告诉编译器,i是随时可能发生变化的,每次使用它的时候必须从内存中取出i的值,因而编译器生成的汇编代码会重新从i地址处读取数据放在k中
这样看来,如果i是一个寄存器变量,表示一个端口数据或者是多个线程的共享数据,那么就容易出错,所以说volatile可以保证对特殊地址的稳定访问