2014-10-12 30 views
0

我知道有關於volatile的問題,但我想問一個不同的問題。我不問它是什麼(一般),我的問題是:是否volatile關鍵字只有阻止編譯器優化代碼使用易變的變量或有任何否則該關鍵字呢?「volatile」是否只能阻止編譯器優化?

+0

'揮發性'和它做的確切是覆蓋全面在一個問題,只有昨天http://stackoverflow.com/questions/26307071/does-the-c-volatile-keyword-introduce-a-memory-fence。 – sjdowling 2014-10-12 10:41:59

+0

這就是爲什麼我問我的問題,爲什麼我這樣問。這是一個簡單的是或否的問題,我不想列出所有'volatile'的東西。 – NPS 2014-10-12 10:47:26

回答

1

針對volatile的內存訪問(讀取和寫入)變量保證以程序中指定的順序發生。這就是真的。這意味着編譯器不允許對它們重新排序(禁用某些編譯器優化),但也必須發出額外的指令以防止CPU重新排序它們。

請注意,這並不妨礙所有非volatile內存訪問被重新排序在volatile的周圍。它只確保volatile內存訪問不會相對於彼此重新排序(並且它們不會被完全優化)

+1

我認爲這不僅僅是訂購?例如。如果你從一個volatile變量中連續讀取兩次,那麼這個變量必須被實際讀取兩次,也就是說,它不能只被讀取一次並重新使用該值? – 2014-10-12 10:35:33

+0

這是交易的一部分。如果添加或刪除新的呼叫,則無法保留原來的順序。正如我所說的,它們「保證按照程序中指定的順序發生」。換句話說,他們不能被添加,刪除或重新排序。對不起,如果不清楚。 – jalf 2014-10-12 10:38:10

+0

好的 - 我認爲這部分只是需要更明確地說明,儘管我現在看到您在最後一句中對此進行了通過引用。 – 2014-10-12 10:39:57

4

將編譯器退出。編譯器是C++中最不有趣的方面,通常不會在您對語言的思考方面發揮作用。

的語言,有這樣說volatile

1.9,1轉述:

訪問volatile對象是根據抽象機的規則嚴格評估。

...

訪問由volatile glvalue指定一個目的是副作用,這是在執行環境中的狀態的變化。

...

實現可以假定任何線索最終將執行下列操作之一:

  • ...
  • 訪問或修改揮發性對象
  • ...

所以,如你所見,volatile對象在某種程度上是程序與外界交互界面的一部分。其中一個後果就是不穩定的訪問被賦予了一定的順序保證,但這只是一個細節。更大的畫面是volatile的意思是「可以與環境互動」。

+0

較早版本的C++(無線程)更少。基本上,volatile實際上意味着實現的定義。 – 2014-10-12 11:07:41