我知道有關於volatile
的問題,但我想問一個不同的問題。我不問它是什麼(一般),我的問題是:是否volatile
關鍵字只有阻止編譯器優化代碼使用易變的變量或有任何否則該關鍵字呢?「volatile」是否只能阻止編譯器優化?
回答
針對volatile
的內存訪問(讀取和寫入)變量保證以程序中指定的順序發生。這就是真的。這意味着編譯器不允許對它們重新排序(禁用某些編譯器優化),但也必須發出額外的指令以防止CPU重新排序它們。
請注意,這並不妨礙所有非volatile
內存訪問被重新排序在volatile
的周圍。它只確保volatile
內存訪問不會相對於彼此重新排序(並且它們不會被完全優化)
我認爲這不僅僅是訂購?例如。如果你從一個volatile變量中連續讀取兩次,那麼這個變量必須被實際讀取兩次,也就是說,它不能只被讀取一次並重新使用該值? – 2014-10-12 10:35:33
這是交易的一部分。如果添加或刪除新的呼叫,則無法保留原來的順序。正如我所說的,它們「保證按照程序中指定的順序發生」。換句話說,他們不能被添加,刪除或重新排序。對不起,如果不清楚。 – jalf 2014-10-12 10:38:10
好的 - 我認爲這部分只是需要更明確地說明,儘管我現在看到您在最後一句中對此進行了通過引用。 – 2014-10-12 10:39:57
將編譯器退出。編譯器是C++中最不有趣的方面,通常不會在您對語言的思考方面發揮作用。
的語言,有這樣說volatile
:
1.9,1轉述:
訪問volatile對象是根據抽象機的規則嚴格評估。
...
訪問由
volatile
glvalue指定一個目的是副作用,這是在執行環境中的狀態的變化。...
實現可以假定任何線索最終將執行下列操作之一:
- ...
- 訪問或修改揮發性對象
- ...
所以,如你所見,volatile
對象在某種程度上是程序與外界交互界面的一部分。其中一個後果就是不穩定的訪問被賦予了一定的順序保證,但這只是一個細節。更大的畫面是volatile
的意思是「可以與環境互動」。
較早版本的C++(無線程)更少。基本上,volatile實際上意味着實現的定義。 – 2014-10-12 11:07:41
- 1. 阻止C#中編譯器優化的'volatile'示例?
- 2. Delphi編譯器是否執行優化?
- 3. MS C++中的內聯彙編是否需要像volatile這樣的東西來阻止優化器插入
- 4. 多態性阻止編譯器優化的示例?
- 5. 在所有編譯器優化禁用時使用volatile
- 6. 編譯器優化
- 7. 編譯器優化
- 8. F#編譯器是否支持與C#編譯器相同的foreach優化
- 9. GNU編譯器優化
- 10. C++編譯器優化
- 11. 編譯器優化實現
- 12. PHP編譯器優化
- 13. 編譯器謂語優化
- 14. 優化css編譯器
- 15. Requirejs優化器不編譯
- 16. 克++編譯器的優化
- 17. Java編譯器優化
- 18. 編譯器優化問題
- 19. 二郎編譯器優化
- 20. C++編譯器能否自動優化float以使我翻倍?
- 21. 編譯器能否優化掉方法調用?
- 22. Kotlin編譯器能否優化掉包裝函數?
- 23. BigDecimal:Java編譯器能否優化乘以1?
- 24. 內聯彙編(__asm)塊可否阻止函數優化?
- 25. MySQL是阻止(或如何優化本)
- 26. Lua編譯器是否優化本地變量?
- 27. C#編譯器是否優化了空的try/catch?
- 28. 編譯器是否優化對常量變量的引用?
- 29. c#編譯器是否會優化空塊
- 30. 是否有優化的組件編譯器?
'揮發性'和它做的確切是覆蓋全面在一個問題,只有昨天http://stackoverflow.com/questions/26307071/does-the-c-volatile-keyword-introduce-a-memory-fence。 – sjdowling 2014-10-12 10:41:59
這就是爲什麼我問我的問題,爲什麼我這樣問。這是一個簡單的是或否的問題,我不想列出所有'volatile'的東西。 – NPS 2014-10-12 10:47:26