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 – 但必须记录下来!
原文地址:https://www.jb51.cc/c/117072.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。