C Volatile与编译器优化

C Volatile与编译器优化,c,compiler-optimization,volatile,C,Compiler Optimization,Volatile,如果关闭编译器优化,即(gcc-o0…),可以说“volatile”关键字没有任何区别吗 我制作了一些示例“C”程序,只有在打开编译器优化(即((gcc-o1…)时,我才在生成的汇编代码中看到易失性和非易失性之间的差异。不,这样的声明是没有依据的 volatile具有标准中规定的特定语义。您认为gcc-O0始终生成代码,使得每个变量--volatile或非-volatile都符合这些语义。这是不可保证的;即使对于特定程序和特定版本恰好如此对于gcc,它可能会在您升级编译器时发生更改。可能vola

如果关闭编译器优化,即(gcc-o0…),可以说“volatile”关键字没有任何区别吗


我制作了一些示例“C”程序,只有在打开编译器优化(即((gcc-o1…)时,我才在生成的汇编代码中看到易失性和非易失性之间的差异。

不,这样的声明是没有依据的


volatile
具有标准中规定的特定语义。您认为
gcc-O0
始终生成代码,使得每个变量--
volatile
或非-volatile都符合这些语义。这是不可保证的;即使对于特定程序和特定版本恰好如此对于
gcc
,它可能会在您升级编译器时发生更改。

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

在GCC4.7和早期版本中,没有优化意味着从一个C指令到下一个C指令(甚至Gimple,即GCC内部表示)的寄存器中并不总是保留值

另外,
volatile
对于符合标准的编译器和人类都有特定的含义。例如,如果读取一些带有
sig\u atomic\t
变量的代码,而该变量不是
volatile
,我会感到不安


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

我怀疑这将取决于所讨论的变量是否可以通过目标上的原子操作来处理,因此,中断不可能使其处于不协调的状态。