【发布时间】:2015-03-05 04:12:16
【问题描述】:
考虑这个代码示例:
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 变量。
-
是
c = 30;的意思是阅读d = 30;吗? -
是的,谢谢马特。我会编辑它。
标签: c language-lawyer volatile