考虑一下这种类型的代码,
while( !cond )
;
如果 cond 没有声明为 volatile,编译器可以通过将其缓存在寄存器中来优化它。在这种情况下,即使设置了 cond,while 循环也会继续。
现在这是否意味着任何此类变量都应该始终声明为 volatile?为什么编译器没有足够聪明地意识到它不应该缓存这些变量?
为什么它不缓存变量?您不会在循环中更改它,因此在 C 看来,它相当于
while (true);
。
也就是说,除非您的程序是多线程的,在这种情况下,变量can可以在循环运行且不执行任何操作时更改。然而,C 语言对线程一无所知(更一般地说,正如 Lundin 所说,关于任何不是从
main
调用的函数或从 main
中调用的函数等),所以你必须自己使用 volatile
让 C 知道正在发生一些它不知道的事情。