[問題] 面試遇到的compiler邏輯問題

看板C_and_CPP作者 (狂禪)時間9年前 (2015/01/05 11:43), 9年前編輯推噓4(4018)
留言22則, 8人參與, 最新討論串1/2 (看更多)
小弟前幾天去面試時, 面試官問了一個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內部運作無關,只是單純邏輯上的問題。 我答不出來,也沒有什麼頭緒,可以請板友幫忙解惑一下嗎?感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.162.99.11 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1420429398.A.5FE.html ※ 編輯: penknifelee (1.162.99.11), 01/05/2015 11:45:13

01/05 11:55, , 1F
我用 clang -O3 編出來的llvm-ir是一樣的
01/05 11:55, 1F

01/05 11:57, , 2F
其實-O2就一樣了
01/05 11:57, 2F

01/05 12:00, , 3F
如果 ptr == ptr->a 呢?
01/05 12:00, 3F

01/05 12:00, , 4F
這叫pointer aliasing
01/05 12:00, 4F

01/05 12:01, , 5F
gcc-4.9 也給出一樣的assembler
01/05 12:01, 5F

01/05 12:03, , 6F
樓上可以試試看如果a的型態是ptype*會怎樣
01/05 12:03, 6F

01/05 12:09, , 7F
clang: 兩者仍然一樣, 而且直接用 memset 0 寫入a,b,c
01/05 12:09, 7F

01/05 12:10, , 8F
gcc: 產出結果完全一樣
01/05 12:10, 8F

01/05 12:15, , 9F
01/05 12:15, 9F

01/05 12:18, , 10F
01/05 12:18, 10F

01/05 12:20, , 11F
還是我誤會了什麼?
01/05 12:20, 11F

01/05 12:44, , 12F
myObj*如果是volatile 或者myObj->ptr是volatile?
01/05 12:44, 12F

01/05 12:45, , 13F
這其實沒啥面試價值,當場gcc -S一下不就知道了嗎....
01/05 12:45, 13F
居然可能是一樣的啊@@ 那我也不知道面試官要的是什麼答案...... 現在才知道gcc能夠給出assembler,又學一招, 感謝! ※ 編輯: penknifelee (1.162.99.11), 01/05/2015 14:19:44

01/05 14:23, , 14F
如果沒有給Obj的定義,其實它有可能是union...
01/05 14:23, 14F

01/05 14:49, , 15F
同猜 volatile, 沒給定義的話根本編不過也沒什麼好討論
01/05 14:49, 15F

01/05 21:04, , 16F
其實我覺得小善正解,union很有可能是面試官想問的XD
01/05 21:04, 16F

01/05 23:30, , 17F
有大大能回文, 若Obj是union的話會怎樣嗎?
01/05 23:30, 17F

01/05 23:34, , 18F
er....a b c share同一塊空間 你覺得會怎樣(汗
01/05 23:34, 18F

01/05 23:34, , 19F
應該說Obj是不是union不重要 Obj->ptr是不是才是重點
01/05 23:34, 19F

01/06 11:54, , 20F
但是這樣好像也不影響結果?最後都是c的結果會保留下來
01/06 11:54, 20F

01/06 11:57, , 21F
啊沒事..看了LPH大的文章了解了
01/06 11:57, 21F

08/29 20:58, , 22F
小善是誰
08/29 20:58, 22F
文章代碼(AID): #1KgWXMN- (C_and_CPP)
文章代碼(AID): #1KgWXMN- (C_and_CPP)