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

作者: ah7675 (阿毛)   2015-04-24 23:24:51
※ [本文轉錄自 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
這也是顛覆了我一直以來的觀念,讓我相當震撼
我應該趕快請前輩喝飲料順便多請教他,還是趁試用期還沒過趕快離職?
請各位給我一些意見,感謝!
作者: a27417332 (等號卡比)   2015-04-25 00:37:00
個人覺得舉例一有問題。那個例子應該不是未定義然後我印象中不一定是同一句,是在sequence point之前
作者: PkmX (阿貓)   2015-04-25 00:41:00
當然是後者第一題一定是array[10] 標準裡面都規範得很清楚了第二題不確定的因素太多了 會怎麼被最佳化是編譯器的事情更別說還有rematerialization這種東西...
作者: dirkc (3781615)   2015-04-25 06:33:00
除了marco拼錯外你是對的,但是否因此離職要看你自己是我拼錯了...果然太早起床了...
作者: uranusjr (←這人是超級笨蛋)   2015-04-25 06:42:00
#MARCO
作者: dirkc (3781615)   2015-04-25 06:45:00
int的話macro通常都編成字面常數,global const反而有少數可能性會多配一塊記憶體早安:)
作者: jaid (jaid)   2015-04-25 07:43:00
Marco Polo XD 原PO是對的
作者: TobyH4cker (Toby (我要當好人))   2015-04-25 11:33:00
#define MY_CONSTANT 1這樣不會多佔一份variable的記憶體
作者: ah7675 (阿毛)   2015-04-25 17:04:00
@PkmX 你的後者是指離職嗎XD?@TobyH4cker 他是指code size喔 不是memory
作者: dirkc (3781615)   2015-04-25 18:34:00
他是說產生出來的執行檔大小嗎?雖然那也是要載到記憶體的不過他還是錯的,通常code size差不多,少數情況global const會大一點;原理是字面常數可以直接當運算元(operand),而global有可能被編成在data seg.,取用或許會多一個組語指令
作者: ah7675 (阿毛)   2015-04-25 18:41:00
我也是這麼回應他的 不過對方似乎不太接受
作者: dirkc (3781615)   2015-04-25 18:53:00
承認錯誤需要勇氣 (其實做個實驗看檔案大小就知道)
作者: suhorng ( )   2015-04-25 19:44:00
@a27: 是說 C++ 的 seq point 語意似乎只到 C++11 為止C++11 就是用新的方式定了 直接訂偏序規範部份先後順序

Links booklink

Contact Us: admin [ a t ] ucptt.com