易失性和编译器优化

时间:2013-01-05 08:20:38

标签: c compiler-optimization volatile

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

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

2 个答案:

答案 0 :(得分:10)

不,没有理由做出这样的声明。

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

答案 1 :(得分:3)

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

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

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

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