看板 C_and_CPP 關於我們 聯絡資訊
以下為 C++ 程式碼 第一種作法: int array[1024]; while (1) { try_to_fill(array); } 第二種作法: while (1) { int array[1024]; try_to_fill(array); } 請問後者的執行速度會比較慢嗎? 還是說編譯參數加了 -O2 之後,這兩種寫法其實都沒有差別? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 36.225.137.168
wtvwtvwtv200:看不懂想表達什麼… 01/12 21:12
purpose:有什麼理由會有差,你懷疑的根據是什麼 01/12 21:14
DJWS:在迴圈裡不斷宣告陣列 會不會增加執行時間? 01/12 21:18
james732:其實你可以實際測量看看,甚至去挖組合語言碼來研究 01/12 21:19
DJWS:如果這個問題已經有固定答案的話 還是先問問專家意見比較快 01/12 21:21
DJWS:因為不知道該下什麼關鍵字去找資料 所以就先到這裡發問了! 01/12 21:24
purpose:迴圈重來,對整數陣列,也不用跑建構、解構,就只是反覆 01/12 21:27
purpose:對同一塊堆疊空間存取而已 01/12 21:28
那如果是這些東西呢? while (true) { int n = 1024; // non-const variable int array[n]; // 似乎是 dynamic array ? (好像C++11才能這樣做) try_to_fill(array); }   while (true) { vector<int> array(1024, 0); // C++ STL vector try_to_fill(array); } while (true) { int n; // a local variable try_to_fill(n); // assign some value to this variable } 若把建立變數的程式碼放在迴圈的外面,效率上會有什麼差別呢? ※ 編輯: DJWS 來自: 36.225.137.168 (01/12 21:39)
purpose:多了跑建構、解構的時間 01/12 21:43
DJWS:那麼參數加上 -O2 可以彌平效率的差別嗎? 01/12 22:10
james732:array[n] 這個東西叫 VAL,C99才有支援 01/12 22:32
james732:我還是很建議你自己實驗看看,不要等人給你答案 01/12 22:32
diabloevagto:這種東西opt會自己處理掉吧 01/13 00:41
diabloevagto:話說那種東西不是自己試一下就有答案了 01/13 00:41
DJWS:這要怎麼試? 01/13 11:59
DJWS:樓上如何得知opt會自己處理掉?想請問哪裡能找到相關資訊? 01/13 12:17
diabloevagto:自己測速度或是看邊出的組語 01/13 13:48
程式當然都是實際測試過才能知道誰快誰慢, 看編譯出來的組語誰多誰少、看哪些指令容易pipeline, 這種回答我覺得沒有切中問題關鍵。 另外我也在stackoverflow上面找到了一些相關的問題 http://stackoverflow.com/questions/407255/ http://stackoverflow.com/questions/982963/ 有人回答到 primitive types 與 POD types 完全沒有差別, 只有 non-POD types 會有建構和解構的差別, 這邊跟 purpose 網友所述是相同的。 不過我還不清楚加上編譯參數 -O1 或者 -O2 是不是能彌平這個差異, 尤其是 vector (C++) / VAL (C) 這個部分, (也就是說,vector沒辦法像array一樣的隨便搬來搬去,來提高程式碼可讀性。) 如果有板友願意回答那就太好了~ ※ 編輯: DJWS 來自: 36.225.132.121 (01/13 15:09)
loveme00835:搬來搬去... 加一個ref就解決的東西想那麼多 01/13 16:18
loveme00835:http://ideone.com/P0BtTf 01/13 16:27
loveme00835:當然 array 要這樣搞也是可以, 但是 ref to arr 你就 01/13 16:31
loveme00835:弄清楚語法了, 一份程式碼要靠最佳化來達成你想的結果 01/13 16:32
loveme00835:還不如一開始就寫成那種架構, 這個compiler達成你的需 01/13 16:33
loveme00835:求了, 那別牌的呢? 01/13 16:33
loveme00835:像你code裡寫的1024也應該是放config file裡面, 不是 01/13 16:35
loveme00835:藏在程式碼要人找, 然後說找不到可讀性低的 01/13 16:36
感謝!原來 & (alias) 是用來處理這種情境的。 之前學到這個語法,不知道可以用在哪裡,今天總算明白了! 另外一方面, 程式員把程式碼搬來搬去提高可讀性, 我猜想編譯器可能可以讓效率維持不變, 我猜想這是編譯器願意處理的事情,是程式碼最佳化的領域。 所以我才會問問看加了 -O2 之後,編譯器它會不會幫你處理這件事。 對我這種外行人來說,編譯器如果有這種功能,那就太好了! (一開始我並不明白 array 和 vector 在此問題之中有何差別,) (直到 purpose 點出了建構解構,我才明白的。也就想把 vector 順便一起問一問。) 最後,1024 這常數只是為了方便舉例,不是原問題的重點。 如果讓你誤會了,請多見諒。 ※ 編輯: DJWS 來自: 36.225.132.121 (01/13 17:28)