瀏覽單個文章
darkangel
Major Member
 
darkangel的大頭照
 

加入日期: Aug 2001
文章: 211
引用:
作者cheneyen
有笑點



擺一起比較容易看出誰狀況外
都幾歲的人了,還在玩因人廢言這套
不論我外不外行,反正我又不是靠寫程式吃飯,如果你講的東西都那麼膚淺,真難想像你會比我高竿多少

你還沒回我喔~~不同的compiler,一樣的input,出來的machine code會一樣?
尊重你是長輩,還是給你留點面子好了:P


你的問題在於自以為 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 好.
__________________
滿招損 謙受益
舊 2010-06-09, 12:28 PM #23
回應時引用此文章
darkangel離線中