作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 一個簡單的const問題
時間Tue Jul 5 14:25:10 2011
※ 引述《XYX16888 (XYX)》之銘言:
: MAC OS / xcode 4 compile
: code :
: int main(void)
: {
: const int var = 10;
: int *vptr = &var;
: *vptr = 20;
: printf("%d\n", var);
^^^
compile 到這一行的時候
聰明的 compiler 發現 var 是常數
所以不需要再從記憶體中取值了
直接把 10 拿來傳進 printf 即可
這叫 constant propagation
是相當基本的最佳化技術
: 想請問*vptr 到底改到哪裡的值?
: 明明不是有把var的地址assign給vptr嗎?
: 結果因為var是const 變數 因此 assign *vptr為20時 到底改到哪裡的值?
: 謝謝
因為你跟 compiler 說 var 是常數
所以他假設 *vptr 不管發生什麼事,var 都固定是 10
但是 compiler 並沒有義務一定要做 constant propagation
也就是即使他輸出 20 那也不是他的責任
試圖寫入常數是 undefined behavior
上述的 code 在 C++ 中甚至直接視為 compile error
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.15.163
推 james732:[讚] 07/05 14:28
推 angleevil:當別人已經回答undefined behavior,發問者就要好好想 07/05 14:31
→ angleevil:錯在哪了,如果這程式是核彈程式,你早就歸天了. 07/05 14:32
推 ledia:還好啦, undefined 是要看運氣歸天 (誤) 07/05 14:35
推 XYX16888:我只是在做測試 故意寫錯 然後了解整個過程 二樓說的太 07/05 14:37
→ XYX16888:嚴重了吧@@ 07/05 14:37
→ angleevil:undefined behavior是經常再折磨工程師的肝,所以真的沒 07/05 14:42
→ angleevil:誇大效果. 07/05 14:43
→ tropical72:我覺得花時間在 try undefined behavior 很沒效率, 07/05 16:38
→ tropical72:應有更多 topic 可以玩,知道那是 U.B. 就別再試了. 07/05 16:38
→ tropical72:應要搞的話,下面問題搞死不少人 07/05 16:45
推 VictorTom:[讚] 07/05 23:13