2014-09-24 76 views
1

我遇到此帖子this,它試圖解釋volatile成員函數和const volatile成員函數。頂部回答者指出易失性的成員函數和const

標記的成員函數爲const或易失性(或組合的常量 揮發性的)應用於那些限定符到這個指針在 功能

使用什麼上述意思?如何將方法的this限定符標記爲volatile或const volatile影響this指針?

我很困惑什麼,這將意味着該方法(或多個)這樣

class foo 
{ 
    void someMethod() volatile 
    {std::cout << "volatile method" } 

    void otherMethod() const volatile 
    {std::cout << "const volatile method"} 
}; 
+1

在你的例子中,你沒有引用'this'(隱式或顯式地),所以限定符不起作用。 – 2014-09-24 19:20:25

+1

http://en.cppreference.com/w/cpp/language/cv – Decipher 2014-09-24 19:22:38

+0

@OliverCharlesworth Yup。我的錯。 :) – 0x499602D2 2014-09-24 19:40:18

回答

5

如果thisvolatile,它會影響到編譯器來更新優化掉往/返成員指向能力*this

volatile的典型使用案例是您有硬件寄存器的地方 - 不是典型的使用class來描述硬件寄存器,但我們可以這樣做。

例如,人們可以有這樣一類:

class my_hardware_device 
{ 
    public: 
    int32_t reg1; 
    int32_t reg2; 
    private: 
    int32_t reserved; 
    public: 
    int32_t reg4; 
    int func() volatile; 
}; 

volatile my_hardware_device hw1 = 
    reinterpret_cast<volatile my_hardware_device*>(0x10000000); 
... 
int my_hardware_device::func() volatile 
{ 
    reg2 = 3; 
    reg3 = 8; 
    reg2 = 7; 
    if (reg2 == 4) 
    { 
     ... 
    } 
} 

... 
hw1->func(); 

沒有volatile,編譯器很可能決定刪除reg2 = 3並確定reg2 == 4永遠是假的,一方面是因爲reg2 = 7;。但是由於它實際上是指向某些硬件,它並不像編譯器所期望的那樣。 [這是一個非常愚蠢的例子,只是爲了說明它是如何工作的 - 我無意以任何方式暗示這是任何此類硬件接口的「正確」或「良好」解決方案 - 不必介意可移植性問題以及所有方式還有其他的東西 - 當然如果你試圖在虛擬函數中使用它,那麼vtable會造成徹底的破壞 - 如果你正在處理驅動程序中的硬件,你可能需要vtable來解決硬件變種問題,給出另一個原因以不同的方式實現這種代碼。]

const變體意味着,編譯器是不允許寫入的*this成員(換言之成員在類foo在你的例子),除非它們被標記作爲mutable(或者如果使用const_cast來丟棄順便說一句 - const_cast也可以用來擺脫揮發性,順便說一句)。

constvolatile結合在一起意味着讀取無法優化,編譯器也不允許更新*this的成員。