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