![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - C++嫩咖一問,跪求大家幫忙
(https://www.pcdvd.com.tw/showthread.php?t=896712)
|
---|
引用:
有笑點 引用:
引用:
擺一起比較容易看出誰狀況外 都幾歲的人了,還在玩因人廢言這套 不論我外不外行,反正我又不是靠寫程式吃飯,如果你講的東西都那麼膚淺,真難想像你會比我高竿多少 你還沒回我喔~~不同的compiler,一樣的input,出來的machine code會一樣? 尊重你是長輩,還是給你留點面子好了:P |
if...else和switch...
這些都僅是分支敘述... 效能好與壞得看compiler決定.. 對OO來說(啥??..誰叫他"時髦"...:flash:..).. 大量的使用除了讓整個商業邏輯不好看、較難維護(例如某一個方法(method/operation)裡面有一大堆的連續if...else if/switch...case語句,在Martin的重構書籍中,這是Long Method情況..).. 且會違反一些OOP原則(ex: OCP)... 善用一些pattern去切割(效能未必好..只是好維護..)... 可以把問題的範圍去縮小(能縮多小就得看個人了..)... 事實上,寫程式我們幾乎常常違背那些原則...:laugh:.. 客戶??啥??... 一般誰管你.. 他們要執行(買..)結果就好啦..:laugh:.. |
引用:
你的問題在於自以為 switch 比 if 高明, 卻沒探究兩者之間的本質差異, 如果 if 真的很糟糕, 那為什麼 ANSI C 不乾脆把 if 給廢掉算了? 我寫個範例給你看: 1 #include <iostream> 2 int main(void) 3 { 4 using namespace std; 5 6 int i; 7 8 if (i == 1) { 9 cout << "1\n"; 10 } 11 if (i == 2) { 12 cout << "2\n"; 13 } 14 cout << "0\n"; 15 16 switch (i) { 17 case 1: 18 cout << "1\n"; 19 break; 20 case 2: 21 cout << "2\n"; 22 break; 23 default: 24 cout << "0\n"; 25 break; 26 } 27 28 return 0; 29 } 未最佳化前產生的機器碼, 一個簡單的 if 改成 switch 語法, 會多出兩個 jmp. 80485dd: 83 7c 24 1c 01 cmpl $0x1,0x1c(%esp) 80485e2: 75 14 jne 80485f8 <main+0x24> 80485e4: c7 44 24 04 a4 87 04 movl $0x80487a4,0x4(%esp) 80485eb: 08 80485ec: c7 04 24 00 9a 04 08 movl $0x8049a00,(%esp) 80485f3: e8 fc fe ff ff call 80484f4 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 80485f8: 83 7c 24 1c 02 cmpl $0x2,0x1c(%esp) 80485fd: 75 14 jne 8048613 <main+0x3f> 80485ff: c7 44 24 04 a7 87 04 movl $0x80487a7,0x4(%esp) 8048606: 08 8048607: c7 04 24 00 9a 04 08 movl $0x8049a00,(%esp) 804860e: e8 e1 fe ff ff call 80484f4 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 8048613: c7 44 24 04 aa 87 04 movl $0x80487aa,0x4(%esp) 804861a: 08 804861b: c7 04 24 00 9a 04 08 movl $0x8049a00,(%esp) 8048622: e8 cd fe ff ff call 80484f4 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 8048627: 8b 44 24 1c mov 0x1c(%esp),%eax 804862b: 83 f8 01 cmp $0x1,%eax 804862e: 74 07 je 8048637 <main+0x63> 8048630: 83 f8 02 cmp $0x2,%eax 8048633: 74 18 je 804864d <main+0x79> 8048635: eb 2c jmp 8048663 <main+0x8f> 8048637: c7 44 24 04 a4 87 04 movl $0x80487a4,0x4(%esp) 804863e: 08 804863f: c7 04 24 00 9a 04 08 movl $0x8049a00,(%esp) 8048646: e8 a9 fe ff ff call 80484f4 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 804864b: eb 2a jmp 8048677 <main+0xa3> 804864d: c7 44 24 04 a7 87 04 movl $0x80487a7,0x4(%esp) 8048654: 08 8048655: c7 04 24 00 9a 04 08 movl $0x8049a00,(%esp) 804865c: e8 93 fe ff ff call 80484f4 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 8048661: eb 14 jmp 8048677 <main+0xa3> 8048663: c7 44 24 04 aa 87 04 movl $0x80487aa,0x4(%esp) 804866a: 08 804866b: c7 04 24 00 9a 04 08 movl $0x8049a00,(%esp) 8048672: e8 7d fe ff ff call 80484f4 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> 最佳化之後, 很抱歉就是直接給結果, 我是有幾分證據說幾分話的, 不知道可笑的人是誰: 8048649: c7 44 24 08 02 00 00 movl $0x2,0x8(%esp) 8048650: 00 8048651: c7 44 24 04 57 87 04 movl $0x8048757,0x4(%esp) 8048658: 08 8048659: c7 04 24 80 99 04 08 movl $0x8049980,(%esp) 8048660: e8 d3 fe ff ff call 8048538 <_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@plt> 8048665: c7 44 24 08 02 00 00 movl $0x2,0x8(%esp) 804866c: 00 804866d: c7 44 24 04 57 87 04 movl $0x8048757,0x4(%esp) 8048674: 08 8048675: c7 04 24 80 99 04 08 movl $0x8049980,(%esp) 804867c: e8 b7 fe ff ff call 8048538 <_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i@plt> 當然這是不考慮其他輸出入的狀況下來說, 當然程式的 coding style 也很重要, 但我們絕對不應該隨便說 switch 一定會比 if 好. |
引用:
呵, 你說的很正確, 其實我覺得會動最重要, 真的在用時, 我也不在乎 if 跟 switch. 我只是看那個半瓶水不爽要要噹他而已, 誰叫他在別的討論串嗆我, 我沒那麼閒~ |
6 int i=rand();
最優化就不能直接丟結果了、if 和 switch 都會變成 cmp 和 jne :like: |
引用:
你還說沒因人廢言? 如果你認為有噹到我~那你達到目的了,這樣有開心了嗎?有快樂了嗎?(不過我只是覺得好笑,連中文都可以硬亂解讀) 範例: A:你女朋友化妝會比較漂亮? B:化妝有用嗎?不會做家事不過是個公主?當然女生外表也很重要,但我們絕對不應該隨便說有化妝比會做家事重要 都幾歲的人了,連要扣帽子技巧都那麼差,我要提醒自己,不要變成這樣子 還有,你噹到我囉^^" 我好難過喔^^" 笑一下唄,幹嘛那麼嚴肅? |
引用:
所以外行跟內行決定在有沒有在別的討論串嗆到對方...... :jolin: :jolin: :jolin: |
引用:
就說你內行的, 所以我沒說一定是說通常啊 :like: :like: :like: |
引用:
在 PCDVD 這麼多年, 我對別人都很忍讓, 但是這個傢伙一直對我的發言指指點點讓我非常不爽, 在我眼裡, 他真的是外行, 這世界上沒有人什麼都懂的, 我也不是什麼高手, 每個人都有每個人擅長跟不會的地方. 但是我們真的不懂, 就要謙虛點, 別老愛裝得很懂的樣子對人指指點點, 結果根本就是錯的. 反正他惹到的人應該也不止我一個, 你應該常看到有人罵他. |
引用:
就本討論串而言,我是真的認為程式撰寫本身的優雅跟易讀性高過那xxxxx微秒的效能,尤其樓主算是語言的新手,以後說不定也是在這個業界打滾,實在不應該讓他覺得撰寫時要偏執到計較編譯後多幾個命令。 程式設計這個圈子比較封閉,很難跟外人討論,有問題了也只能圈子內的互相幫忙,實在不想看到互貼內行外行的標籤。 是以本討論串而言,其他討論串歸其他討論串。 |
所有的時間均為GMT +8。 現在的時間是08:27 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。