Re: [討論] 關於for的變數宣告

看板C_and_CPP (C/C++)作者 (藍影)時間15年前 (2011/06/24 20:40), 編輯推噓14(14024)
留言38則, 14人參與, 最新討論串2/2 (看更多)
※ 引述《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

06/24 20:41, , 1F
又要回到那串文章"面試考題 程式最佳化"了嘛 XDD
06/24 20:41, 1F

06/24 20:41, , 2F
t大今天守哪一區呢? XD
06/24 20:41, 2F

06/24 20:45, , 3F
e 大見笑了,我只是 "鳥仔屎" 而已.
06/24 20:45, 3F

06/24 20:46, , 4F
個人以為 scope 是在高階語言討論的
06/24 20:46, 4F

06/24 20:47, , 5F
這個變數不在 scope 內並不代表它在那時不佔空間
06/24 20:47, 5F

06/24 20:47, , 6F
compiler 其實可以對這種變數做一些空間上的最佳化
06/24 20:47, 6F

06/24 20:47, , 7F
感謝!
06/24 20:47, 7F

06/24 20:48, , 8F
也或者是簡化 stack 區的取得
06/24 20:48, 8F

06/24 20:48, , 9F
那麼這樣一來這種寫法就不一定不快了
06/24 20:48, 9F

06/24 20:50, , 10F
scope只是coding上的限制而已, t大會有這種疑問是因為
06/24 20:50, 10F

06/24 20:51, , 11F
VC6的關係吧? 這個我都會用巨集做掉
06/24 20:51, 11F

06/24 20:51, , 12F
對齁 還有VC6..自從我換VC2005之後早就沒有這個問題了 XD
06/24 20:51, 12F

06/24 20:52, , 13F
被發現了,實際上手邊還是要 6.0/2008 輪著跑.
06/24 20:52, 13F

06/24 20:52, , 14F
謝謝 LPH66 與 loveme00835 解答 *^_^*
06/24 20:52, 14F

06/24 20:52, , 15F
以前寫 VC6 總是因為這個改宣告位置...其實有點煩 XD
06/24 20:52, 15F

06/24 20:54, , 16F
Dev C 這點比 VC6 還難用 (不得已才碰了一下Dev C)
06/24 20:54, 16F

06/24 21:27, , 17F
可以提一下VC6的問題嗎?小弟沒用過Orz
06/24 21:27, 17F

06/24 22:07, , 18F
在 VC6 把 i 放在 for() 裡宣告的話
06/24 22:07, 18F

06/24 22:07, , 19F
那個 i 的 scope 不是正確的只在 for 裡
06/24 22:07, 19F

06/24 22:07, , 20F
而是會變成包含 for 的那一個 {}
06/24 22:07, 20F

06/24 22:08, , 21F
所以當你在同一個 {} 裡有兩個 for(int i...) 時
06/24 22:08, 21F

06/24 22:08, , 22F
VC6 就會噴重覆宣告的 error
06/24 22:08, 22F

06/24 22:30, , 23F
所以在 VC6 下, 會迫使你使用原原 PO 第二種方法寫
06/24 22:30, 23F

06/24 23:18, , 24F
推LPH大:)
06/24 23:18, 24F

06/25 04:52, , 25F
寫action script的時候也會有這種困擾XD
06/25 04:52, 25F

06/25 09:26, , 26F
我之前寫 C++ 的時候就有故意寫第二種,就是因為 VC6
06/25 09:26, 26F

06/25 09:26, , 27F
帶來的 portability 問題。沒有這困擾的話,第一種在閱
06/25 09:26, 27F

06/25 09:27, , 28F
讀上及維護上比第二種好是無可置疑的
06/25 09:27, 28F

06/25 10:04, , 29F
我也覺得演算法設計才是真正的重點0.0
06/25 10:04, 29F

06/25 14:15, , 30F
看compiler與處理器的搭配,compare to zero大部分都
06/25 14:15, 30F

06/25 14:15, , 31F
是免錢的,ex for ARM: "i=N;do{}while(i--);"
06/25 14:15, 31F

06/25 15:08, , 32F
VC6都幾十年了...還在用.
06/25 15:08, 32F

06/26 08:35, , 33F
有時候也是沒辦法啊, 有些公司還在用 Borland C++ 咧 ~_~
06/26 08:35, 33F

06/26 08:42, , 34F
有的公司也在用VC6, 為什麼不換? 為什麼要換? XDD
06/26 08:42, 34F

06/26 17:48, , 35F
一切都是客戶和管理階層腦袋的錯
06/26 17:48, 35F

06/26 23:39, , 36F
感謝LPH66大講解
06/26 23:39, 36F

06/27 23:01, , 37F
vc6:1998,vc2002:2002,四年來的案子要換也不容易.最後
06/27 23:01, 37F

06/27 23:01, , 38F
也只會愈積愈久,且,還有部份案子應還在用TC吧.
06/27 23:01, 38F
文章代碼(AID): #1E18MXwX (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1E18MXwX (C_and_CPP)