【问题标题】:Volatile and compiler optimization易失性和编译器优化
【发布时间】:2012-12-19 15:36:48
【问题描述】:

如果关闭编译器优化(即 (gcc -o0 ....)),是否可以说 'volatile' 关键字没有区别?

我已经制作了一些示例“C”程序,并且仅在打开编译器优化即((gcc -o1 ....)时,才看到生成的汇编代码中易失性和非易失性之间的区别。

【问题讨论】:

  • 我怀疑这将取决于是否可以通过目标上的原子操作来处理相关变量,因此不会出现中断使其处于不一致状态。

标签: c compiler-optimization volatile


【解决方案1】:

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

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

另外,volatile 对符合标准的编译器和人类都有特定的含义。例如,如果读取一些带有sig_atomic_t 变量的代码,而该变量是not volatile!

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

【讨论】:

    【解决方案2】:

    不,这样的说法是没有根据的。

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

    【讨论】:

      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      相关资源
      最近更新 更多