[問題] 面試遇到的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