2011-01-28 72 views
27
class MyClass 
{ 
    int x, y; 
    void foo() volatile { 
     // do stuff with x 
     // do stuff with y 
    } 
}; 

是否需要聲明'x'和'y'爲volatile或將所有成員變量視爲volatile自動處理?C++ volatile成員函數

我想確保「stuff with'x'」不會被編譯器的「stuff with y」重新排序。

編輯: 如果我將正常類型轉換爲易失性類型,會發生什麼?這是否會指示編譯器不重新排序訪問該位置?我想在特殊情況下將一個普通變量傳遞給一個參數是volatile的函數。我必須確定編譯器不會重新排序那個調用的先前或之後的讀寫。

+2

大問題。 – 2012-09-09 15:36:40

+0

相關的http:// stackoverflow。com/questions/2444734/what-is-volatile-member-function-in-c – 2016-09-09 00:09:25

回答

22

標記成員函數volatile就像標記它const;這意味着接收者對象被視爲被聲明爲volatile T*。因此,任何對xy的引用將被視爲在成員函數中讀取的volatile。而且,一個volatile對象只能調用volatile成員函數。

這就是說,你可能想要標記xyvolatile無論如何,如果你真的希望所有訪問他們被視爲volatile

4

下面的代碼:

#include <iostream> 

class Bar 
{ 
    public: 

     void test(); 
}; 

class Foo 
{ 
    public: 

     void test() volatile { x.test(); } 

    private: 

     Bar x; 
}; 

int main() 
{ 
    Foo foo; 

    foo.test(); 

    return 0; 
} 

在編譯時引發錯誤用gcc:

main.cpp: In member function 'void Foo::test() volatile': 
main.cpp:14:33: error: no matching function for call to 'Bar::test() volatile' 
main.cpp:7:8: note: candidate is: void Bar::test() <near match> 

而且因爲volatile實例無法調用non-volatile方法,我們可以認爲,是的, xy將在該方法中爲volatile,即使MyClass的實例未被聲明爲volatile

注意:如果您需要,可以使用const_cast<>刪除volatile限定符;但要小心,因爲就像const這樣做會導致在某些情況下未定義的行爲。

6

必須顯式聲明的成員變量..

從標準文檔9.3.2.3

同樣,可變語義(7.1.6.1)在訪問對象及其非靜態數據成員時應用於volatile成員函數。

1

因此,使用原來的例子:

class MyClass 
{ 
    int x, y; 
    void foo() volatile { 
     // do stuff with x 
     // do stuff with y 
     // with no "non-volatile" optimization of the stuff done with x, y (or anything else) 
    } 
    void foo() { 
     // do stuff with x 
     // do stuff with y 
     // the stuff done with x, y (and anything else) may be optimized 
    } 
};