volatile 告诉编译器 i 是随时间可能发生变化的,每次使用它的时候必须从 i 的地址中读取,因而编译器生成的可执行代码会重新从 i 的地址读取数据放在 k 中。而优化做法是,由于编译器发现两次从 i 读取的数据之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 k 中,而不是重新从 i 里面读。这样以来,如果 i 是一个寄存器变量或者表示一个端口数据就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问,不会出错。
volatile 变量的几个例子:
(1)并行设备的硬件寄存器(如:状态寄存器);
(2)一个中断服务子程序中会访问到的非自动变量;
(3)多线程应用中被几个任务共享的变量;
归结:
1、告诉 compiler 不能做任何优化
比如要往某一地址送两指令