C/C++: Volatile Speicifier

 27th March 2021 at 2:51pm

给一个变量置上 volatile 标识符,表示要求编译器不对此变量做优化。

比如这样一段代码:

uint32 status = 0;
  
while (status == 0)
{
  /*Let us assume that status isn't being changed 
  in this while loop or may be in our whole program*/
  
  /*So long as status (which could be reflecting 
  status of some IO port) is ZERO, do something*/
}

如果 while 循环体中 status 的值不会被改变,那编译器可能认为 status 的值一直是 0,并不需要在 while 中做判断。因此它可能把代码优化为 while (true) 的形式。

但是有些情况下,编译器是感知不到 status 值的变化的。比如你在写驱动程序,使用到某种 memory-mapped 内存时,内存的值可能随着外部 I/O 的变化而变化,因此这种情况下编译器无法从代码中感知到值会变化,此时需要给变量置上 volatile 标识符:

volatile uint32 status = 0;

参考