→ 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:當然 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)