简介: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;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时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
}
Run Code Online (Sandbox Code Playgroud)
很明显,编译器能够优化掉函数调用,foo()以便main()返回一个常量,即使foo()标记为volatile …
我有一个多线程C++应用程序.
现在我知道对于全局共享变量,在检查变量状态时应该在某些情况下使用volatile,否则编译器可能会认为变量的值永远不会改变(在该线程中).
但是,如果不是检查变量的状态而是调用返回变量值的方法,该怎么办?例如:
static int num = 0;
...
void foo()
{
while(getNum() == 0)
{
// do something (or nothing)
}
}
Run Code Online (Sandbox Code Playgroud)
我还需要将num变为volatile变量吗?或者编译器是否认识到,因为我正在使用一种方法来访问该变量num,所以它不会缓存结果?
有人有任何想法吗?
提前致谢,
〜朱利安
编辑:在我的while循环中我删除了睡眠调用并用通用的东西替换它,例如注释做某事(或什么都没有)