易失性和编译器优化

如果关闭编译器优化即(gcc -o0 ….),那么’volatile’关键字没有区别可以吗?

我已经制作了一些示例’C’程序,并且只有在打开编译器优化即((gcc -o1 ….)时才能看到生成的汇编代码中volatile和non-volatile之间的区别。

不,没有基础可以作出这样的陈述。

volatile具有标准中规定的特定语义。 您断言gcc -O0始终生成代码,使得每个变量(无论是否为volatile符合这些语义。 这不保证; 即使特定程序和特定版本的gcc恰好是这种情况,例如,当您升级编译器时,它也可能会发生变化。

对于GCC 4.7或更早版本,可能volatilegcc -O0没有太大区别。 但是,这可能在下一版GCC中有所改变(即未来4.8,即当前主干)。 下一个版本还将提供-Og以获得调试友好的优化。

在GCC 4.7及更早版本中,没有优化意味着值并不总是保存在寄存器中,从一个C(甚至是Gimple,即GCC内部表示)指令到下一个。

此外, volatile对于标准符合编译器和人类都具有特定含义。 例如,如果使用sig_atomic_t变的sig_atomic_t变量读取一些代码,我会感到沮丧!

顺便说一句,您可以使用-fdump-tree-all选项获取GCC以获取大量转储文件,或使用MELT域特定语言和插件,特别是其探测通过图形界面查询GCC内部表示。