[问题] 面试遇到的compiler逻辑问题

楼主: penknifelee (狂禅)   2015-01-05 11:43:15
小弟前几天去面试时,
面试官问了一个optimization的问题(a):
void initialize(Obj* myObj){
myObj->ptr->a = 0;
myObj->ptr->b = 0;
myObj->ptr->c = 0;
}
问我如何optimize这段程式,而我有回答出正确答案(b):
void initialize(Obj* myObj){
ptype* p = myObj->ptr;
^^^^^(假设为ptr指到的type)
p->a = 0;
p->b = 0;
p->c = 0;
}
接下来面试官问,虽然compiler会帮忙做optimize,
但在此例中compiler"不敢"直接把程式(a)compile成程式(b),
因为有出错的可能,问我为什么?
面试官并假设假设不会因为signal等原因而有interruption,
也跟compiler内部运作无关,只是单纯逻辑上的问题。
我答不出来,也没有什么头绪,可以请板友帮忙解惑一下吗?感谢!
作者: bibo9901 (function(){})()   2015-01-05 11:55:00
我用 clang -O3 编出来的llvm-ir是一样的其实-O2就一样了
作者: azureblaze (AzureBlaze)   2015-01-05 12:00:00
如果 ptr == ptr->a 呢?这叫pointer aliasing
作者: bibo9901 (function(){})()   2015-01-05 12:01:00
gcc-4.9 也给出一样的assembler
作者: azureblaze (AzureBlaze)   2015-01-05 12:03:00
楼上可以试试看如果a的型态是ptype*会怎样
作者: bibo9901 (function(){})()   2015-01-05 12:09:00
clang: 两者仍然一样, 而且直接用 memset 0 写入a,b,cgcc: 产出结果完全一样http://ideone.com/SX6unb codehttp://ideone.com/Nm7fU0 compiled code还是我误会了什么?
作者: Killercat (杀人猫™)   2015-01-05 12:44:00
myObj*如果是volatile 或者myObj->ptr是volatile?这其实没啥面试价值,当场gcc -S一下不就知道了吗....
作者: littleshan (我要加入剑道社!)   2015-01-05 14:23:00
如果没有给Obj的定义,其实它有可能是union...
作者: uranusjr (←這人是超級笨蛋)   2015-01-05 14:49:00
同猜 volatile, 没给定义的话根本编不过也没什么好讨论
作者: Killercat (杀人猫™)   2015-01-05 21:04:00
其实我觉得小善正解,union很有可能是面试官想问的XD
作者: kwpn (ITSST)   2015-01-05 23:30:00
有大大能回文, 若Obj是union的话会怎样吗?
作者: Killercat (杀人猫™)   2015-01-05 23:34:00
er....a b c share同一块空间 你觉得会怎样(汗应该说Obj是不是union不重要 Obj->ptr是不是才是重点
作者: freef1y3 ( )   2015-01-06 11:54:00
但是这样好像也不影响结果?最后都是c的结果会保留下来啊没事..看了LPH大的文章了解了

Links booklink

Contact Us: admin [ a t ] ucptt.com