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