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变量,则可以将其优化掉.
>静态或全局变量的初始化不计为访问.
解决方法
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 – 但必须记录下来!