Fw: [閒聊] i++ is undefined behavior?

看板C_and_CPP作者 (阿懋)時間9年前 (2015/04/24 23:24), 編輯推噓3(4128)
留言33則, 10人參與, 最新討論串1/2 (看更多)
※ [本文轉錄自 Soft_Job 看板 #1LEb-bDg ] 作者: ah7675 (阿懋) 看板: Soft_Job 標題: [閒聊] i++ is undefined behavior? 時間: Fri Apr 24 23:22:09 2015 最近因為同事在code review時表示 i++會隨編譯器實作而有不同行為 所以要求我不要用這種寫法,到這邊應該很多人會說:"沒錯啊,這你都不懂?" 關鍵在於他舉的例子是這樣的 i=10; val = array[i++]; val equals array[10] or array[11]? 我整個傻住了,我的理解是,答案絕對是val=array[10] 而隨編譯器會變化的地方是,在該expression/statement所構成的 數個指令中"遞增"的時機可能不同,所以如果在一個expression中存取i 兩次以上會造成未定義行為 但suffix increament operator必定是先return再遞增 請問我的理解才是錯的嗎? 那GLIBC裡的strcmp實作也是不可靠的嗎? https://fossies.org/dox/glibc-2.21/string_2strcmp_8c_source.html 還有另一個例子是說const global variable is better than Macro?? 理由是global variable只有一份、用再多次也只是reference同一份 但是macro假設被使用10次就會造成code size增加10倍 用來舉例的型別是int 這也是顛覆了我一直以來的觀念,讓我相當震撼 我應該趕快請前輩喝飲料順便多請教他,還是趁試用期還沒過趕快離職? 請各位給我一些意見,感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.181.142.174 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1429888933.A.36A.html ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: ah7675 (175.181.142.174), 04/24/2015 23:24:51

04/25 00:37, , 1F
個人覺得舉例一有問題。那個例子應該不是未定義
04/25 00:37, 1F

04/25 00:40, , 2F
然後我印象中不一定是同一句,是在sequence point之前
04/25 00:40, 2F

04/25 00:41, , 3F
當然是後者
04/25 00:41, 3F

04/25 01:00, , 4F
第一題一定是array[10] 標準裡面都規範得很清楚了
04/25 01:00, 4F

04/25 01:03, , 5F
第二題不確定的因素太多了 會怎麼被最佳化是編譯器的事情
04/25 01:03, 5F

04/25 01:03, , 6F
更別說還有rematerialization這種東西...
04/25 01:03, 6F

04/25 06:33, , 7F
除了marco拼錯外你是對的,但是否因此離職要看你自己
04/25 06:33, 7F

04/25 06:36, , 8F
是我拼錯了...果然太早起床了...
04/25 06:36, 8F

04/25 06:42, , 9F
#MARCO
04/25 06:42, 9F

04/25 06:45, , 10F
int的話macro通常都編成字面常數,global const反而有少數可
04/25 06:45, 10F

04/25 06:46, , 11F
能性會多配一塊記憶體
04/25 06:46, 11F

04/25 07:05, , 12F
早安:)
04/25 07:05, 12F

04/25 07:43, , 13F
Marco Polo XD 原PO是對的
04/25 07:43, 13F

04/25 11:33, , 14F
#define MY_CONSTANT 1
04/25 11:33, 14F

04/25 11:33, , 15F
這樣不會多佔一份variable的記憶體
04/25 11:33, 15F

04/25 17:04, , 16F
@PkmX 你的後者是指離職嗎XD?
04/25 17:04, 16F

04/25 17:05, , 17F
@TobyH4cker 他是指code size喔 不是memory
04/25 17:05, 17F

04/25 18:34, , 18F
他是說產生出來的執行檔大小嗎?雖然那也是要載到記憶體的
04/25 18:34, 18F

04/25 18:34, , 19F
不過他還是錯的,通常code size差不多,少數情況global const
04/25 18:34, 19F

04/25 18:37, , 20F
會大一點;原理是字面常數可以直接當運算元(operand),而glob
04/25 18:37, 20F

04/25 18:39, , 21F
al有可能被編成在data seg.,取用或許會多一個組語指令
04/25 18:39, 21F

04/25 18:41, , 22F
我也是這麼回應他的 不過對方似乎不太接受
04/25 18:41, 22F

04/25 18:53, , 23F
承認錯誤需要勇氣 (其實做個實驗看檔案大小就知道)
04/25 18:53, 23F

04/25 19:44, , 24F
@a27: 是說 C++ 的 seq point 語意似乎只到 C++11 為止
04/25 19:44, 24F

04/25 19:45, , 25F
C++11 就是用新的方式定了 直接訂偏序規範部份先後順序
04/25 19:45, 25F

05/21 14:45, , 26F
1. 一定是array[10], 2. Operator precedence問題,
05/21 14:45, 26F

05/21 14:50, , 27F
3. 巨集(非define XXX)應該比較耗記憶體沒錯
05/21 14:50, 27F

05/21 14:54, , 28F
更正:應該錯非常數宣告(ex. #define A 1...)
05/21 14:54, 28F

05/21 15:20, , 29F
應該是指Macro與Function所實作出來的差別
05/21 15:20, 29F

05/21 15:21, , 30F
但應該不是"variable"吧!因為#define不是應該是常數嗎?
05/21 15:21, 30F

05/21 15:23, , 31F
如果說是global const跟#define的常數比較,最明顯應該就
05/21 15:23, 31F

05/21 15:23, , 32F
"type checking"
05/21 15:23, 32F

06/11 03:25, , 33F
這種程度快點離職吧,沒事別說別人的文章無聊
06/11 03:25, 33F
文章代碼(AID): #1LEc14tZ (C_and_CPP)
文章代碼(AID): #1LEc14tZ (C_and_CPP)