缺少volatile修饰时,在低的优化等级下一些不明现的问题,会在高优化等级下暴露出来。
这些问题会有不同的表现形式。例如,在轮询硬件时,程序可能陷入死循环;多线程代码可能会运行异常;优化机制将延时代码忽略掉。所以,在某些特定情况下,变量需要用volatile来修饰。
变量被volatile修饰过后,就相当于告诉编译器:这个变量的值随时会被修改,例如运行系统、中断程序、或者硬件都能修改该变量的值。由于变量的值随时可能被修改,就要求这个变量的值在内存中是随时可以被访问到的。这意味着编译器不能对该变量进行优化操作,例如“将变量的值缓存在寄存器中,导致内存无法访问该变量的值”。
相反地,如果一个变量没有被声明为volatile,编译器就会假设它的值只会被预期的方式修改。因此,编译器能够对该变量进行优化操作。