2013-10-09 192 views
8

您能給出一個簡單或真實世界的例子來演示volatile複製構造函數的用法嗎?什麼是volatile複製構造函數?

我只是不能拿出一個。

+6

當您有易失物體時,您需要易失性的copy-ctor。所以問題歸結爲:你什麼時候需要易變的物體? – Nawaz

回答

8

爲@Nawaz已經指出:

當你有揮發性的對象,你需要揮發性拷貝構造函數。所以問題歸結爲:你什麼時候需要易變的物體?

使用volatile關鍵字的主要原因通常是禁用優化。也就是說,如果你有這樣的事情:

bool flag = false; 
if(!flag) {} 

編譯器會看到,標誌不能更改,因此沒有必要每次都檢查標記 - 所以它不會。但是,如果你讓旗變易變 - 它會。

下面是volatile關鍵字原來使用的意見:link

總之,它最初是用來通過MMIO訪問硬件,這可能是有點不尋常:

unsigned char* pControl = 0xff24 ; 
*pControl = 0 ; 
*pControl = 0 ; 
*pControl = 0 ; 

,你不由於優化,希望這3個作業成爲一個作業。

下面是由安德烈Alexandrescu的論文在多線程軟件揮發性:link

有一些論文批評Alexandrescu的的論文,但是我找不到它。關鍵在於他拋棄了易變的財產等等。

注意對多線程非常重要的事情,指出了@JanHudec:

volatile是完全無用的,多線程的情況下,因爲雖然它阻止優化,它不會產生明顯的障礙。沒有在一個CPU上完成的寫操作可能對另一個CPU不可見(依賴於架構; x86具有連貫的高速緩存,因此寫操作始終可見)。

另外volatile不強制操作是原子操作。在x86上的分配總是原子的,但並非所有CPU架構都是如此。更復雜的操作如增量只能使用std::atomic進行原子化。

+0

該意見不可用,請嘗試使用有效的固定鏈接。 – Zeta

+0

@澤塔 - 謝謝。不知何故,URL被搞亂了;編輯。 –

+3

對於多線程上下文而言'volatile'完全沒有用處,因爲雖然它阻止了優化,但它不會產生明確的障礙。沒有在一個CPU上完成的寫操作可能對另一個CPU不可見(依賴於架構; x86具有連貫的高速緩存,因此寫操作始終可見)。 –