1. C语言的volatile的含义是什么
  2. 使用volatile会对编译器有什么暗示

volatile的意思是易变的。也就是说,在程序运行过程中,有一些变量可能会随时改变

  1. 实际上,优化器 为了节约时间,有时候不会去重复读变量的值,而是去读在 寄存器 里面的备份。因此,如果变量改变了,就有可能会出错。此类情况,在嵌入式设备上常见
  2. 如果一个变量被volatile修饰,编译器每次都会去老老实实读一遍,而不会用寄存器里的备份

由于 访问寄存器 的速度要比 访问RAM 来的快,因此编译器会进行“优化”,即减少访问RAM,而是读取寄存器里的备份
但如果有一些变量经常莫名其妙的改变,这样就会导致读取错误
volatile即告诉编译器,无论何时,都要去变量所在的内存中读取值,而不要读取寄存器里的备份

使用volatile的例子

  1. 并行设备的硬件寄存器,如状态寄存器
  2. 一个中断服务子程序中,会访问到的非自动变量(Non-automatic variables)
  3. 多线程应用中,被几个任务共享的变量。例如嵌入式程序员经常同硬件、中断、RTOS等打交道,所用这些都要求使用volatile变量