[問題] volitile 在語言上的需求

看板C_and_CPP作者 ( )時間12年前 (2011/07/30 02:58), 編輯推噓5(5021)
留言26則, 8人參與, 最新討論串1/2 (看更多)
volatile 關鍵字很少被討論 一般而言是使用在禁止 compiler 做對記憶體的最佳化 舉例來說,一個 system call 的參數通常會設定為 volatile 如此一來, inter-procedural optimization 的 constant propagation 就 不會建立 clone function,或者是利用 calling convention 來偷偷刪除參數 小弟不才我有個疑問,就是為什麼宣告為 volatile 的物件 所有的接口都必須要有 volatile 關鍵字 在 function call 當 parameter 很容易理解 但是如果是在同一個 function 裡面,例如這樣寫 #define MAX_SIZE 100 template<typename DataType> class A { private: DataType volatile m_Data[MAX_SIZE]; public: void f( int index ) { **** DataType *ptr = &(m_Data[index]); ... do some operation on ptr ... } }; compiler 會說 **** 那行會出錯,因為 ptr 沒有 volatile 關鍵字 解決方法就是利用 const_cast 去除 volatile modifier 為什麼 compiler 一定需要 volatile 關鍵字才讓我轉型 不轉型會死嗎? 在語言上有甚麼樣的 cast,如果沒有轉型會造成錯誤呢? 還請板上高手幫小弟解惑 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.104.108.86

07/30 03:06, , 1F
我在想應該是 compiler 對普通變數能做的最佳化
07/30 03:06, 1F

07/30 03:06, , 2F
也能對經過指標存取的變數最佳化
07/30 03:06, 2F

07/30 03:06, , 3F
例如把值留在 register 等等這種事不論值從哪來都能做
07/30 03:06, 3F

07/30 03:07, , 4F
那如果你不說指標指向的是個 volatile 的值那就可能出事
07/30 03:07, 4F

07/30 03:08, , 5F
如果只是函式內要用的話我會傾向把指標變數加上 volatile
07/30 03:08, 5F

07/30 03:08, , 6F
以這例就是寫成 DataType volatile *ptr (應該沒弄錯...)
07/30 03:08, 6F

07/30 03:17, , 7F
我的疑問是 data 本身是 volatile,但是為什麼 address 也要
07/30 03:17, 7F

07/30 03:17, , 8F
是 volatile。事實上,雖然 data 會改變,但是 address 不會
07/30 03:17, 8F

07/30 03:18, , 9F
變阿,那compiler 最佳化也沒差才對。 要怎麼設計一個 case
07/30 03:18, 9F

07/30 03:19, , 10F
讓 compiler 如果允許 pointer 沒有 volatile,程式就會出錯
07/30 03:19, 10F

07/30 03:27, , 11F
那個 volatile 是加在被指到的型態上,不是指標自己。
07/30 03:27, 11F

07/30 03:30, , 12F
got it~ thank you~
07/30 03:30, 12F

07/30 08:15, , 13F
某些時候用在跟硬體實際相關的場合 ex: Memory Mapping
07/30 08:15, 13F

07/30 08:17, , 14F
IO volatile 就真的很重要 所以才會檢查指標指到地方的屬
07/30 08:17, 14F

07/30 08:19, , 15F
性吧... F 桑說得應該就是重點 >w< 不是指標本身volatile
07/30 08:19, 15F

07/30 16:16, , 16F
如果是指標自己volatile要寫成 datatype * volatile ptr;
07/30 16:16, 16F

07/30 16:17, , 17F
我只知道用指標存取暫存器會需要用到volatile
07/30 16:17, 17F

07/30 23:50, , 18F
volatile應該就是避免使用cache而已...跟其他硬體有關
07/30 23:50, 18F

07/30 23:51, , 19F
比如說DMA... CPU以為那區已經被快取了,而直接使用快取內的
07/30 23:51, 19F

07/30 23:51, , 20F
資料... 就會發生錯誤, 或是CPU還把資料放在快取,但硬體卻
07/30 23:51, 20F

07/30 23:51, , 21F
需要記憶體上的內容以寫到別的裝置上... 就會發生錯誤
07/30 23:51, 21F

07/31 00:25, , 22F
volatile不是避免使用cache,而是避免使用register
07/31 00:25, 22F

07/31 00:26, , 23F
實際上cache還是會發生作用
07/31 00:26, 23F

07/31 00:56, , 24F
"避免使用register" <- 把它背下來!!!
07/31 00:56, 24F

07/31 01:02, , 25F
到底volatile是什麼意思由實作決定,可是文件常常都不齊:(
07/31 01:02, 25F

07/31 01:02, , 26F
gcc的文件: gcc.gnu.org/onlinedocs/gcc/Volatiles.html
07/31 01:02, 26F
文章代碼(AID): #1ECmBQw4 (C_and_CPP)
文章代碼(AID): #1ECmBQw4 (C_and_CPP)