看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《chengen0402 (藏)》之銘言: : 我最近不斷被同學提醒for的寫法 : 我原本的寫法 : for(int i=0 ; i<n ; ++i) : for(int j=0 ; j<n ;++j) 其實不少 c++ 的書都建議:用到時再用就好, 意思是不少書都建議你原本的寫法。 : 同學一直覺得這樣太慢 一直跟我說可以改成 : int i,j; : for(i=0 ; i<n ; ++i) : for(j=0 ; j<n ; ++j) 我比較想請教您同學的是, 請問這樣比較快的依據是什麼? 看編出來的 asm code ? 還是實際測時的結果? 方便的話請拿一點點數據出來參考,以解我的疑惑。 --------- 如果真的是要速度的話,倒是有幾種說法 (1) int i=0, j=0; 改成 int i(0), j(0); (2) 後置轉前置 (這你有用了) 原因:inc / add 差異 (3) for(int i=0; i<n; ++i) 適當改成 int i(n-1); while(i>=0) {..... , --i); 原因:zero flag 認為 (3) 這類較快的人,原因在於,和 0 做比較速度比和其他常數做比較速度為快 ( zero flag ),甚至可以 != 就用 !=,這在硬體用 xor 就完成。 甚至也有人說用 ( >= 取代 < ) 還是 ( <= 取代 > ) 可以比較「省電」, 這種說法我也很難去驗證。 以上三種說法都有人反駁,因 compiler 都應要有能力去優化這些地方, coder 不該去管這些東西,也就是說,用你原本的寫法便可。 --------------- 這些真的都是小問題,即使有差異,有沒有差到 3% 我都很懷疑, 但演算法動不動就是差幾千、幾萬倍,除非整個專案已經擠到沒地方擠了, 不然做這種研究效益、正確性真的不佳。 --------------- 但接下來這問題倒是沒聽別人討論 for(int i=0; i!=10; ++i){ ... } 「據說」i 的 scope 每個 compiler 定義不同, 不知其他版友有何看法。 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.73.222
ericinttu:又要回到那串文章"面試考題 程式最佳化"了嘛 XDD 06/24 20:41
ericinttu:t大今天守哪一區呢? XD 06/24 20:41
tropical72:e 大見笑了,我只是 "鳥仔屎" 而已. 06/24 20:45
LPH66:個人以為 scope 是在高階語言討論的 06/24 20:46
LPH66:這個變數不在 scope 內並不代表它在那時不佔空間 06/24 20:47
LPH66:compiler 其實可以對這種變數做一些空間上的最佳化 06/24 20:47
chengen0402:感謝! 06/24 20:47
LPH66:也或者是簡化 stack 區的取得 06/24 20:48
LPH66:那麼這樣一來這種寫法就不一定不快了 06/24 20:48
loveme00835:scope只是coding上的限制而已, t大會有這種疑問是因為 06/24 20:50
loveme00835:VC6的關係吧? 這個我都會用巨集做掉 06/24 20:51
LPH66:對齁 還有VC6..自從我換VC2005之後早就沒有這個問題了 XD 06/24 20:51
tropical72:被發現了,實際上手邊還是要 6.0/2008 輪著跑. 06/24 20:52
tropical72:謝謝 LPH66 與 loveme00835 解答 *^_^* 06/24 20:52
LPH66:以前寫 VC6 總是因為這個改宣告位置...其實有點煩 XD 06/24 20:52
ericinttu: Dev C 這點比 VC6 還難用 (不得已才碰了一下Dev C) 06/24 20:54
tomap41017:可以提一下VC6的問題嗎?小弟沒用過Orz 06/24 21:27
LPH66:在 VC6 把 i 放在 for() 裡宣告的話 06/24 22:07
LPH66:那個 i 的 scope 不是正確的只在 for 裡 06/24 22:07
LPH66:而是會變成包含 for 的那一個 {} 06/24 22:07
LPH66:所以當你在同一個 {} 裡有兩個 for(int i...) 時 06/24 22:08
LPH66:VC6 就會噴重覆宣告的 error 06/24 22:08
loveme00835:所以在 VC6 下, 會迫使你使用原原 PO 第二種方法寫 06/24 22:30
VictorTom:推LPH大:) 06/24 23:18
peacedove:寫action script的時候也會有這種困擾XD 06/25 04:52
adrianshum:我之前寫 C++ 的時候就有故意寫第二種,就是因為 VC6 06/25 09:26
adrianshum:帶來的 portability 問題。沒有這困擾的話,第一種在閱 06/25 09:26
adrianshum:讀上及維護上比第二種好是無可置疑的 06/25 09:27
singlovesong:我也覺得演算法設計才是真正的重點0.0 06/25 10:04
as0:看compiler與處理器的搭配,compare to zero大部分都 06/25 14:15
as0:是免錢的,ex for ARM: "i=N;do{}while(i--);" 06/25 14:15
horngsh:VC6都幾十年了...還在用. 06/25 15:08
uranusjr:有時候也是沒辦法啊, 有些公司還在用 Borland C++ 咧 ~_~ 06/26 08:35
ericinttu:有的公司也在用VC6, 為什麼不換? 為什麼要換? XDD 06/26 08:42
angleevil:一切都是客戶和管理階層腦袋的錯 06/26 17:48
tomap41017:感謝LPH66大講解 06/26 23:39
tropical72:vc6:1998,vc2002:2002,四年來的案子要換也不容易.最後 06/27 23:01
tropical72:也只會愈積愈久,且,還有部份案子應還在用TC吧. 06/27 23:01