摘要:關鍵字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
在這種情況下是否存在差異)。
您有一個函數返回'volatile int',而不是volatile函數。 – ildjarn 2013-03-07 22:42:54
我不認爲這是真的*重複*和關閉是不正確的,但無論如何。 C++中的一個重要區別是'volatile'成員函數。退房http://stackoverflow.com/questions/4826719/c-volatile-member-functions – 2013-03-07 22:46:56
看看http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766 – user1929959 2013-03-07 23:08:46