回答
爲@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
進行原子化。
該意見不可用,請嘗試使用有效的固定鏈接。 – Zeta
@澤塔 - 謝謝。不知何故,URL被搞亂了;編輯。 –
對於多線程上下文而言'volatile'完全沒有用處,因爲雖然它阻止了優化,但它不會產生明確的障礙。沒有在一個CPU上完成的寫操作可能對另一個CPU不可見(依賴於架構; x86具有連貫的高速緩存,因此寫操作始終可見)。 –
- 1. 爲什麼調用複製構造函數而不是移動構造函數?
- 2. 爲什麼在調用複製構造函數之前調用構造函數?
- 3. 爲什麼複製構造函數需要是const?
- 4. 「複製」構造函數的實際用途是什麼?
- 5. 爲什麼構造函數不是構造函數?
- 6. 什麼是好習慣?複製構造函數或防禦複製方法
- 7. 複製構造函數
- 8. 複製構造函數bug
- 9. 複製構造函數類
- 10. 複製構造函數
- 11. Cython:複製構造函數
- 12. 複製點構造函數
- 13. doubleLinkedList複製構造函數
- 14. 複製構造函數?
- 15. C++複製構造函數
- 16. Matlab複製構造函數
- 17. 複製構造函數 - C++
- 18. 這是複製構造函數elision嗎?
- 19. 這是爲什麼調用複製構造函數,而不是移動構造函數?
- 20. 什麼是複製構造函數,什麼時候應該在C#中使用?
- 21. 雙列表複製構造函數:與單列表複製構造函數有什麼不同?
- 22. 爲什麼模板複製構造函數會覆蓋默認的複製構造函數?
- 23. C + +複製構造函數不復制
- 24. 強制複製構造函數而不是移動構造函數
- 25. 爲什麼複製構造函數不像默認構造函數或析構函數那樣「鏈接」?
- 26. 爲什麼調用轉發引用構造函數而不是複製構造函數?
- 27. 什麼是對象構造函數?
- 28. AS3構造函數 - 重點是什麼?
- 29. 什麼類型是構造函數?
- 30. Coq中的構造函數是什麼?
當您有易失物體時,您需要易失性的copy-ctor。所以問題歸結爲:你什麼時候需要易變的物體? – Nawaz