哪裏是存儲在程序存儲器(在哪個部分)中存儲的易失性變量?易失變量
易失變量
回答
變量的變化不會改變存儲變量的地方。它改變的是關於如何在讀取和寫入方面訪問它的語義。
我不相信C標準說什麼關於揮發性的執行。但通常情況下,易失性保證釋放變量讀操作的語義和變量讀操作的獲取語義。這不會對每個執行是真實的,雖然,你應該在你的具體的編譯器保證
沒有理由對volatile變量存儲內存的任何「特殊」部分中閱讀起來。它通常與其他變量一起存儲,包括非易失性變量。如果一些編譯器決定在某些特殊的內存段中存儲易失性變量 - 沒有什麼可以阻止它這樣做。但在語言層面上,這絕對沒有理由。
你爲什麼問這樣一個問題?是什麼讓你覺得它應該被存儲在一些特殊的內存段中?
在C volatile
只是告訴編譯器 - 「您沒有足夠的知識來承擔這個變量的值並沒有改變」。沒有「部分」,例如BSS,CSS。
它的標誌考慮到編譯防止某些類型的優化的。它非常方便嵌入式編程,其中由於硬件設備輸入,某個地址的內存可能會「改變」。
這裏有一個很好的解釋:http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658
volatile
是type qualifier不是storage class specifier,所以也沒有確定的存儲位置在所有;它會影響變量類型的定義,而不是其存儲。
它簡單地強制編譯器明確地讀取變量從變量的存儲位置,其類型是volatile
(可以是任何地方),而不是假設在例如寄存器一些先前讀取值仍然有效。
volatile對存儲類沒有任何處理。
揮發性只是告訴編譯器或強制編譯器「不求最優化」爲變量。 因此,編譯器不會優化該變量的代碼,並且從指定位置讀取值,而不是通過保存前一個值的內部寄存器。
因此,通過聲明變量作爲揮發性..它給garrantee,你會得到最新的值,它可以通過一個外部事件alterred。
如果您沒有將該變量聲明爲volatile,但有時可能有機會得不到正確的值。 所以爲了避免我們應該聲明變量爲volatile。
揮發性與外部事件處理時,像的硬件相關的引腳的中斷通常使用。
示例。 正在讀取adc值。
const可變意味着 您不能修改或更改代碼中該變量的值。只有外部事件才能更改該值。
控制器引腳通常被定義爲易失性。 可能是通過聲明變量,因爲易失性控制器將「通過引腳讀取」而不是「通過鎖存器讀取」......這是我的設想。可能是錯誤的...
但仍然有很多困惑時選擇的變量爲volatile ..
變量應聲明揮發時它的價值可能會意外更改。在實踐中,只有三種類型的變量可以改變:
內存映射外設寄存器
通過中斷服務程序的多線程應用程序
內全局變量修改全局變量
鏈接:http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword
所以它在這種情況下被提供給變量。
「揮發性」是在C/C++規範中使用,以允許使用存儲器映射的設備。它指示編譯器不要優化用this關鍵字定義的變量,只是因爲該變量在編譯器可見代碼中似乎沒有改變其狀態。
- 1. 非易失性變量
- 2. arduino線程更新易失性變量
- 3. 通過示例瞭解易失變量
- 4. 用於訪問易失性實例變量的局部變量
- 5. 常量/變量和不可變/易變
- 6. !不同!易變的變量?
- 7. Java:易變變量訪問
- 8. 部分易變的變量?
- 9. 變量應該變得易變嗎?
- 10. $ stateParams的易變數量
- 11. jQuery的易變量發出
- 12. 在java中註冊非易失性變量的配置
- 13. asp.net中的非易失性全局變量
- 14. gcc是否重新排序我的易失性變量?
- 15. 無法更改易失性變量的值
- 16. AVR:重置爲零的易失性變量
- 17. armcc是否使用-O0優化非易失性變量?
- 18. 使用鎖定和易失性緩存變量
- 19. 爲什麼這個易失變量的地址總是在1?
- 20. 正確使用易失性變量和同步塊
- 21. 什麼可以強制刷新非易失性變量?
- 22. LazyInitializer.EnsureInitialized中的易變局部變量?
- 23. Paypal支付大量交易失敗時進行大宗交易
- 24. Magento - 交易電子郵件 - 變量
- 25. 交易所POST變量使用CAMEL
- 26. AEM很容易如何重用變量
- 27. C++丟失變量
- 28. Bash $ @變量失敗
- 29. 失蹤CLASSPATH變量
- 30. Session變量消失
不,它沒有給出這些語義見[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