如果关闭编译器优化(即(gcc -o0 ....)),可以说'volatile'关键字没有区别吗?
我已经制作了一些示例“C”程序,并且仅在打开编译器优化时才看到生成的汇编代码中易失性和非易失性之间的区别,即((gcc -o1 ....)。
如果关闭编译器优化(即(gcc -o0 ....)),可以说'volatile'关键字没有区别吗?
我已经制作了一些示例“C”程序,并且仅在打开编译器优化时才看到生成的汇编代码中易失性和非易失性之间的区别,即((gcc -o1 ....)。
不,做出这样的声明是没有根据的。
volatile
具有标准中规定的特定语义。您断言gcc -O0
总是生成代码,使得每个变量(volatile
或不)都符合这些语义。这不能保证;即使它恰好是特定程序和特定版本的情况gcc
,例如,当您升级编译器时,它也可能会发生变化。
可能与-for GCC 4.7 或更早版本volatile
没有太大区别。gcc -O0
然而,这可能会在 GCC 的下一个版本(即未来的 4.8,即当前的主干)中发生变化。并且下一个版本还将提供-Og
对调试友好的优化。
在 GCC 4.7 和更早版本中,没有优化意味着值并不总是保存在从一个 C(甚至 Gimple,即 GCC 内部的内部表示)指令到下一个指令的寄存器中。
此外,volatile
对于符合标准的编译器和人类都有特定的含义。例如,如果阅读一些带有不是的变量的代码,我会感到sig_atomic_t
不安! volatile
顺便说一句,您可以使用-fdump-tree-all
GCC 的选项来获取大量转储文件,或者使用MELT域特定语言和插件,特别是它的探针通过图形界面查询 GCC 内部表示。