什么时候可以完全优化易失性变量?

前端之家收集整理的这篇文章主要介绍了什么时候可以完全优化易失性变量?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑以下代码示例:
int main(void)
{
  volatile int a;
  static volatile int b;

  volatile int c;
  c = 20;
  static volatile int d;
  d = 30;

  volatile int e = 40;
  static volatile int f = 50;

  return 0;
}

如果没有volatile,编译器可以优化掉所有变量,因为它们永远不会被读取.

我认为a和b可以被优化掉,因为它们完全没用,见unused volatile variable.

我认为c和d无法被删除,因为它们被写入,并且写入volatile变量必须实际发生. e应该相当于c.

GCC不会优化f,但它也不会发出任何写入指令.在数据部分中设置50. LLVM(clang)完全删除f.

这些陈述是真的吗?

>如果永远不会访问volatile变量,则可以将其优化掉.
>静态或全局变量的初始化不计为访问.

解决方法

写入volatile变量(甚至是自动变量)计为可观察行为.

C11(N1570)5.1.2.3/6:

The least requirements on a conforming implementation are:

— Accesses to volatile objects are evaluated strictly according to the rules of the abstract
machine.

— At program termination,all data written into files shall be identical to the result that
execution of the program according to the abstract semantics would have produced.

— The input and output dynamics of interactive devices shall take place as specified in
7.21.3. The intent of these requirements is that unbuffered or line-buffered output
appear as soon as possible,to ensure that prompting messages actually appear prior to
a program waiting for input.

This is the observable behavior of the program.

问题是:初始化(e,f)算作“访问”吗?正如Sander de Dycker所指出的那样,6.7.3说:

What constitutes an access to an object that has volatile-qualified type is implementation-defined.

这意味着由编译器决定是否可以优化e和f – 但必须记录下来!

猜你在找的C&C++相关文章