2012-01-25 30 views
0

我有腦抽筋:C++:const volatile的方法

struct MyStruct 
{ 
    int x; 

    ... 

    inline int getX1() const { return x; } 
    inline int getX2() const volatile { return x; } 
}; 

volatile MyStruct myStruct; 

我明白,編譯器將讓我叫myStruct.getX2(),不會讓我叫myStruct.getX1(),因爲方法要求volatile結構體/類必須具有這些方法的volatile限定符。

我的問題是:如果我創造這樣的課,我發佈以供其他軟件程序,是什麼,我會添加或不添加方法揮發性預選賽的原因是什麼?

是因爲一個方法標記volatile告訴編譯器不承擔任何成員都不volatile,用於優化的目的,而如果一個方法不標記volatile,那麼任何成員不能標記volatile可以優化?

+0

可能的[C++ - 當應用於某個方法時volatile表示什麼?](http://stackoverflow.com/questions/5106196/c-what-does-volatile-represent-when-applied-to-a -method) –

回答

3

該標準不適用於任何標準的類提供volatile成員函數,所以在你也不應該正常情況下。

對於最後一段中的含義你是對的 - 就像const成員函數一樣,在volatile成員函數this是一個指向易失性的指針。因此,無論您的實現如何實現易失性內存訪問(禁用各種優化,對於初學者),它都會通過this進行任何訪問。

我懷疑這隻會是值得提供volatile成員函數爲包裝的內存可能實際上是揮發性或可能不是某一位的類。然後用戶可以創建一個volatile或非volatile對象。如果內存肯定需要揮發的話,我覺得你有具有volatile數據成員的非volatile物體更好。

現在我試圖想象一個真正的使用 - 一個「計數器」類,可以創建一個魔術地址的頂部由硬件更新或由您寫的中斷(在這種情況下,你可以創建一個帶有新位置的volatile實例),但也有一個用例,它只是通過來自「普通」代碼的調用進行更新(在這種情況下,它可以是非易失性實例)。在這兩種情況下,您可能只是想讓數據成員變得「揮霍無比」,因爲它沒有其他傷害。但你可能提供volatile和非volatile成員函數的版本,其中包含相同的代碼,其中一個將被優化,而另一個不會。

+0

'std :: atomic'具有大部分成員函數的'volatile'重載。 –

+1

「那麼我認爲你最好使用具有volatile數據成員的非易失性對象」 - - 實際上 - 我實際上有一個具有volatile成員對象並擁有數據成員的頂級對象。 (有一個原因,我不能進入這裏。) –

+0

@Steve我最終從谷歌這裏結束了,因爲新的放置位置不適用於易失性指針。請參閱:http://ideone.com/FHTVr – Eloff

1

這是因爲標記爲volatile的方法告訴編譯器不要假定其任何成員不是易失性的,爲了優化的目的,而如果某個方法沒有標記爲volatile,那麼任何未標記volatile的成員都可以優化?

是的。

volatile功能,*this對象變成volatile這又意味着所述類的每個非靜態成員變得volatile,就像在一個const功能,*this對象變成const這又意味着每個非靜態成員的班級成爲const

話雖如此,從積極優化涉及成員在volatile函數的代碼編譯製止。