看板 C_and_CPP 關於我們 聯絡資訊
貢獻一下我自己對volatile的看法: 一開始我自己也是一知半解, 後來接觸嵌入式領域以後才比較清楚. 關於volatile的解釋是: 如果一個變數會因為外力而改變(非程式控制流程) 那每次取值請到memory中去讀取 一般而言, compiler會把 一個變數會被放在CPU的register or cache, 因為DRAM 的latency可是很嚇人的 ( DRAM 光 RTL 讀取都要好幾個cycle, 更遑論CPU處理 ) 所以直接放在CPU中or Cache中可以快速取值. 然而某些情況 如果某些變數的值會被ISR改變, 這種情況, 到快取中取得的值就是錯誤的 因此你必須每次都到記憶體中去抓取. 例如Timer_ticks就是個很好的例子. 因為timer的值並非是自己寫的程式主動去改動, 因此需要宣告成volatile, 告訴CPU抓取這個值的時候必須到記憶體中去讀取. ※ 引述《windows2k (程式宅 <囧>)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : VC++/GCC/CLANG : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : None : 問題(Question): : volatile大概是C/C++最難了解的關鍵字之一 : 最近在看完這篇[How to zero a buffer](http://bit.ly/1wmpbys)產生的問題 : 在開啟最佳化之後,對照Assembly Code,所有的編譯器會捨棄掉stack上的memset。 : 不過如果照他的方式刻一個,會發現所有Compiler都會做清空的動作 : static void : secure_memzero(void * p, size_t len) : { : volatile uint8_t * _p = p; : while (len--) *_p++ = 0; : } : 不過中間有句話不太明瞭 : The C standard states that accesses to volatile objects are part of the : unalterable observable behaviour — but it says nothing about accesses via : lvalue expressions with volatile types. Consequently a sufficiently : intelligent compiler can still optimize the buffer-zeroing away in this case : — it just has to prove that the object being accessed was not originally : defined as being volatile. : 我不知道這段話是否正確,不過還沒找到Standard是否有類似的規定 : 如果這段話是正確的話,目前找到的 : C11的[memset_s](http://bit.ly/1qJG7vv) : Windows的[SecureZeroMemory](http://bit.ly/1oC33rV) : 作法都一樣,難道不怕被最佳化掉嘛 : 請大家指點迷津吧.. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.120.142 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1410942542.A.B3E.html
csee: = =看到標題才發現討論錯主題 版主可以幫忙刪嗎? 09/17 16:30
damody: 沒講錯呀~ 提供另一種角度思考xd 09/17 23:06
loveme00835: xDD 09/18 00:21
carylorrk: 一般環境 cache 是由 CPU/OS 管的。Compiler 還有可能 09/18 06:16
carylorrk: 乾脆把變數或 expression 用 constant 取代掉~ 09/18 06:19
carylorrk: volatile 在底層比較常用是因爲寫底層根據我們對硬體及 09/18 06:27
carylorrk: 環境的瞭解才能保證 atomic operation. 這在 app 層是 09/18 06:29
carylorrk: 有很多顧慮的。所以才需要 sync utilities 像是 lock 09/18 06:32
carylorrk: 和 atomic 09/18 06:32