如果关闭编译器优化,那么'volatile'关键字没有区别,即(gcc -o0 ....)?
我已经制作了一些示例'C'程序,并且只有在打开编译器优化时才会看到生成的汇编代码中volatile和non-volatile之间的区别,即((gcc -o1 ....)。
答案 0 :(得分:10)
不,没有理由做出这样的声明。
volatile
具有标准中详细说明的特定语义。您断言gcc -O0
总是生成代码,使得每个变量 - volatile
或不符合 - 都符合这些语义。这不保证;即使特定程序和gcc
的特定版本恰好是这种情况,例如,当您升级编译器时,它也可能会发生变化。
答案 1 :(得分:3)
可能volatile
与gcc -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内部表示通过图形界面。