2009-11-03 66 views

回答

7

變量的變化不會改變存儲變量的地方。它改變的是關於如何在讀取和寫入方面訪問它的語義。

我不相信C標準說什麼關於揮發性的執行。但通常情況下,易失性保證釋放變量讀操作的語義和變量讀操作的獲取語義。這不會對每個執行是真實的,雖然,你應該在你的具體的編譯器保證

+0

不,它沒有給出這些語義見[this](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html)和[CERT](https ://www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive)說'不要使用volatile'進行同步' – Spudd86

2

沒有理由對volatile變量存儲內存的任何「特殊」部分中閱讀起來。它通常與其他變量一起存儲,包括非易失性變量。如果一些編譯器決定在某些特殊的內存段中存儲易失性變量 - 沒有什麼可以阻止它這樣做。但在語言層面上,這絕對沒有理由。

你爲什麼問這樣一個問題?是什麼讓你覺得它應該被存儲在一些特殊的內存段中?

9

在C volatile只是告訴編譯器 - 「您沒有足夠的知識來承擔這個變量的值並沒有改變」。沒有「部分」,例如BSS,CSS。

它的標誌考慮到編譯防止某些類型的優化的。它非常方便嵌入式編程,其中由於硬件設備輸入,某個地址的內存可能會「改變」。

這裏有一個很好的解釋:http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

+0

優化時,編譯器會從哪裏獲得這個假定值?我的意思是記憶的哪個部分? – kapilddit

+1

這取決於,通常編譯器會「記住」該值在CPU寄存器中。 volatile會迫使編譯器不要做出這種假設,並重新加載每個訪問的值(通常來自主內存)。 – Justicle

21

volatiletype qualifier不是storage class specifier,所以也沒有確定的存儲位置在所有;它會影響變量類型的定義,而不是其存儲。

它簡單地強制編譯器明確地讀取變量從變量的存儲位置,其類型volatile(可以是任何地方),而不是假設在例如寄存器一些先前讀取值仍然有效。

4

volatile對存儲類沒有任何處理。

揮發性只是告訴編譯器或強制編譯器「不求最優化」爲變量。 因此,編譯器不會優化該變量的代碼,並且從指定位置讀取值,而不是通過保存前一個值的內部寄存器。

因此,通過聲明變量作爲揮發性..它給garrantee,你會得到最新的值,它可以通過一個外部事件alterred。

如果您沒有將該變量聲明爲volatile,但有時可能有機會得不到正確的值。 所以爲了避免我們應該聲明變量爲volatile。

揮發性與外部事件處理時,像的硬件相關的引腳的中斷通常使用。

示例。 正在讀取adc值。

const可變意味着 您不能修改或更改代碼中該變量的值。只有外部事件才能更改該值。

控制器引腳通常被定義爲易失性。 可能是通過聲明變量,因爲易失性控制器將「通過引腳讀取」而不是「通過鎖存器讀取」......這是我的設想。可能是錯誤的...

但仍然有很多困惑時選擇的變量爲volatile ..

變量應聲明揮發時它的價值可能會意外更改。在實踐中,只有三種類型的變量可以改變:

  1. 內存映射外設寄存器

  2. 通過中斷服務程序的多線程應用程序

  3. 全局變量修改全局變量

鏈接:http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

所以它在這種情況下被提供給變量。

1

「揮發性」是在C/C++規範中使用,以允許使用存儲器映射的設備。它指示編譯器不要優化用this關鍵字定義的變量,只是因爲該變量在編譯器可見代碼中似乎沒有改變其狀態。