2013-03-07 74 views
13

摘要:關鍵字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在這種情況下是否存在差異)。

+18

您有一個函數返回'volatile int',而不是volatile函數。 – ildjarn 2013-03-07 22:42:54

+2

我不認爲這是真的*重複*和關閉是不正確的,但無論如何。 C++中的一個重要區別是'volatile'成員函數。退房http://stackoverflow.com/questions/4826719/c-volatile-member-functions – 2013-03-07 22:46:56

+0

看看http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766 – user1929959 2013-03-07 23:08:46

回答

20

在你的代碼中,volatile關鍵字不適用的功能,但返回類型,它是等價的:

typedef volatile int Type; 
Type foo(); 

現在,在C++中,你可以做一個成員功能volatile在同樣的方式,const預選賽,並且行爲是一樣的:

struct test { 
    void vfunction() volatile; 
}; 

基本上你不能說在非易失性(alterantively非const)功能volatile類型(分別爲const)的實例類型:

struct test { 
    void vfunction() volatile; 
    void function(); 
}; 
volatile test t; 
t.vfunction();  // ok 
t.function();  // error 
4

foo()不易變。

這是一個返回volatile int的函數。

這是合法的。但奇怪的是返回int

另一方面,成員函數可以是volatile,因爲它們可以是const

+1

+1,特別是評論*但奇怪的是返回的'int' *。事實上,編譯器可以自由地從返回的對象中刪除'volatile'限定符。 – 2013-03-07 23:18:31