[問題] 迴圈外宣告陣列 / 迴圈裡宣告陣列 的效率差異
以下為 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
→
01/12 21:12, , 1F
01/12 21:12, 1F
推
01/12 21:14, , 2F
01/12 21:14, 2F
→
01/12 21:18, , 3F
01/12 21:18, 3F
→
01/12 21:19, , 4F
01/12 21:19, 4F
→
01/12 21:21, , 5F
01/12 21:21, 5F
→
01/12 21:24, , 6F
01/12 21:24, 6F
推
01/12 21:27, , 7F
01/12 21:27, 7F
→
01/12 21:28, , 8F
01/12 21:28, 8F
那如果是這些東西呢?
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)
推
01/12 21:43, , 9F
01/12 21:43, 9F
→
01/12 22:10, , 10F
01/12 22:10, 10F
→
01/12 22:32, , 11F
01/12 22:32, 11F
→
01/12 22:32, , 12F
01/12 22:32, 12F
→
01/13 00:41, , 13F
01/13 00:41, 13F
→
01/13 00:41, , 14F
01/13 00:41, 14F
→
01/13 11:59, , 15F
01/13 11:59, 15F
→
01/13 12:17, , 16F
01/13 12:17, 16F
→
01/13 13:48, , 17F
01/13 13:48, 17F
程式當然都是實際測試過才能知道誰快誰慢,
看編譯出來的組語誰多誰少、看哪些指令容易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)
→
01/13 16:18, , 18F
01/13 16:18, 18F
→
01/13 16:27, , 19F
01/13 16:27, 19F
→
01/13 16:31, , 20F
01/13 16:31, 20F
→
01/13 16:32, , 21F
01/13 16:32, 21F
→
01/13 16:33, , 22F
01/13 16:33, 22F
→
01/13 16:33, , 23F
01/13 16:33, 23F
→
01/13 16:35, , 24F
01/13 16:35, 24F
→
01/13 16:36, , 25F
01/13 16:36, 25F
感謝!原來 & (alias) 是用來處理這種情境的。
之前學到這個語法,不知道可以用在哪裡,今天總算明白了!
另外一方面,
程式員把程式碼搬來搬去提高可讀性,
我猜想編譯器可能可以讓效率維持不變,
我猜想這是編譯器願意處理的事情,是程式碼最佳化的領域。
所以我才會問問看加了 -O2 之後,編譯器它會不會幫你處理這件事。
對我這種外行人來說,編譯器如果有這種功能,那就太好了!
(一開始我並不明白 array 和 vector 在此問題之中有何差別,)
(直到 purpose 點出了建構解構,我才明白的。也就想把 vector 順便一起問一問。)
最後,1024 這常數只是為了方便舉例,不是原問題的重點。
如果讓你誤會了,請多見諒。
※ 編輯: DJWS 來自: 36.225.132.121 (01/13 17:28)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章