摘要volatile
:当应用于 C 和 C++ 中的函数声明时 ,关键字有什么作用?
详情:
我看到可以编译一个标记为volatile
. 但是,我不确定这会阻止什么编译器优化(如果有的话)。例如,我创建了以下测试用例:
volatile int foo() {
return 1;
}
int main() {
int total = 0;
int i = 0;
for(i = 0; i < 100; i++) {
total += foo();
}
return total;
}
当我使用clang -emit-llvm -S -O3 test.c
(gcc 也可以工作,但我认为 llvm IR 更具可读性)编译时,我得到:
target triple = "x86_64-unknown-linux-gnu"
define i32 @foo() #0 {
ret i32 1
}
define i32 @main() #0 {
ret i32 100
}
所以很明显,编译器能够优化对函数的调用,foo()
以便main()
返回一个常量,即使foo()
标记为volatile
. 所以我的问题是volatile
在限制编译器优化方面应用于函数声明时是否有任何作用。
(请注意,我对这个问题的兴趣主要是对了解做什么volatile
而不是解决任何特定问题的好奇心。)
(另外,我将这个问题标记为 C 和 C++,不是因为我认为它们是同一种语言,而是因为我有兴趣知道volatile
这两种语言在这种情况下的作用是否存在差异)。