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