看板 C_and_CPP 關於我們 聯絡資訊
小弟前幾天去面試時, 面試官問了一個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
bibo9901: 我用 clang -O3 編出來的llvm-ir是一樣的 01/05 11:55
bibo9901: 其實-O2就一樣了 01/05 11:57
azureblaze: 如果 ptr == ptr->a 呢? 01/05 12:00
azureblaze: 這叫pointer aliasing 01/05 12:00
bibo9901: gcc-4.9 也給出一樣的assembler 01/05 12:01
azureblaze: 樓上可以試試看如果a的型態是ptype*會怎樣 01/05 12:03
bibo9901: clang: 兩者仍然一樣, 而且直接用 memset 0 寫入a,b,c 01/05 12:09
bibo9901: gcc: 產出結果完全一樣 01/05 12:10
bibo9901: http://ideone.com/SX6unb code 01/05 12:15
bibo9901: http://ideone.com/Nm7fU0 compiled code 01/05 12:18
bibo9901: 還是我誤會了什麼? 01/05 12:20
Killercat: myObj*如果是volatile 或者myObj->ptr是volatile? 01/05 12:44
Killercat: 這其實沒啥面試價值,當場gcc -S一下不就知道了嗎.... 01/05 12:45
居然可能是一樣的啊@@ 那我也不知道面試官要的是什麼答案...... 現在才知道gcc能夠給出assembler,又學一招, 感謝! ※ 編輯: penknifelee (1.162.99.11), 01/05/2015 14:19:44
littleshan: 如果沒有給Obj的定義,其實它有可能是union... 01/05 14:23
uranusjr: 同猜 volatile, 沒給定義的話根本編不過也沒什麼好討論 01/05 14:49
Killercat: 其實我覺得小善正解,union很有可能是面試官想問的XD 01/05 21:04
kwpn: 有大大能回文, 若Obj是union的話會怎樣嗎? 01/05 23:30
Killercat: er....a b c share同一塊空間 你覺得會怎樣(汗 01/05 23:34
Killercat: 應該說Obj是不是union不重要 Obj->ptr是不是才是重點 01/05 23:34
freef1y3: 但是這樣好像也不影響結果?最後都是c的結果會保留下來 01/06 11:54
freef1y3: 啊沒事..看了LPH大的文章了解了 01/06 11:57
kkmoon5566: 小善是誰 08/29 20:58