如果this
標volatile
,它會影響到編譯器來更新優化掉往/返成員指向能力*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
也可以用來擺脫揮發性,順便說一句)。
將const
和volatile
結合在一起意味着讀取無法優化,編譯器也不允許更新*this
的成員。
在你的例子中,你沒有引用'this'(隱式或顯式地),所以限定符不起作用。 – 2014-09-24 19:20:25
http://en.cppreference.com/w/cpp/language/cv – Decipher 2014-09-24 19:22:38
@OliverCharlesworth Yup。我的錯。 :) – 0x499602D2 2014-09-24 19:40:18