PCDVD數位科技討論區

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)

cheneyen 2010-06-09 12:02 PM

引用:
作者darkangel
對啊對啊, 你內行的!
最佳化之後, 通常 compiler 就直接丟結果進去 :like: :like: :like:

有笑點

引用:
作者cheneyen
還用,寫if else不夠漂亮,switch比較有美感

引用:
作者darkangel
但是以 C/C++ 來說, if 跟 switch 做出來的最終機器碼是不同的, 不見得 switch 會比 if 高明

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

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

vxr 2010-06-09 12:16 PM

if...else和switch...
這些都僅是分支敘述...
效能好與壞得看compiler決定..

對OO來說(啥??..誰叫他"時髦"...:flash:..)..
大量的使用除了讓整個商業邏輯不好看、較難維護(例如某一個方法(method/operation)裡面有一大堆的連續if...else if/switch...case語句,在Martin的重構書籍中,這是Long Method情況..)..
且會違反一些OOP原則(ex: OCP)...
善用一些pattern去切割(效能未必好..只是好維護..)...
可以把問題的範圍去縮小(能縮多小就得看個人了..)...
事實上,寫程式我們幾乎常常違背那些原則...:laugh:..

客戶??啥??...
一般誰管你..
他們要執行(買..)結果就好啦..:laugh:..

darkangel 2010-06-09 12:28 PM

引用:
作者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 好.

darkangel 2010-06-09 12:32 PM

引用:
作者vxr
if...else和switch...
這些都僅是分支敘述...
效能好與壞得看compiler決定..

對OO來說(啥??..誰叫他"時髦"...:flash:..)..
大量的使用除了讓整個商業邏輯不好看、較難維護(例如某一個方法(method/operation)裡面有一大堆的連續if...else if/switch...case語句,在Martin的重構書籍中,這是Long Method情況..)..
且會違反一些OOP原則(ex: OCP)...
善用一些pattern去切割(效能未必好..只是好維護..)...
可以把問題的範圍去縮小(能縮多小就得看個人了..)...
事實上,寫程式我們幾乎常常違背那些原則...:laugh:..

客戶??啥??...
一般誰管你..
他們要執行(買..)結果就好啦..:laugh:..


呵, 你說的很正確, 其實我覺得會動最重要, 真的在用時, 我也不在乎 if 跟 switch.
我只是看那個半瓶水不爽要要噹他而已, 誰叫他在別的討論串嗆我, 我沒那麼閒~

ganlingyang 2010-06-09 12:36 PM

6 int i=rand();

最優化就不能直接丟結果了、if 和 switch 都會變成 cmp 和 jne :like:

cheneyen 2010-06-09 12:51 PM

引用:
作者darkangel
呵, 你說的很正確, 其實我覺得會動最重要, 真的在用時, 我也不在乎 if 跟 switch.
我只是看那個半瓶水不爽要要噹他而已, 誰叫他在別的討論串嗆我, 我沒那麼閒~

你還說沒因人廢言?
如果你認為有噹到我~那你達到目的了,這樣有開心了嗎?有快樂了嗎?(不過我只是覺得好笑,連中文都可以硬亂解讀)

範例:
A:你女朋友化妝會比較漂亮?
B:化妝有用嗎?不會做家事不過是個公主?當然女生外表也很重要,但我們絕對不應該隨便說有化妝比會做家事重要

都幾歲的人了,連要扣帽子技巧都那麼差,我要提醒自己,不要變成這樣子
還有,你到我囉^^" 我好難過喔^^" 笑一下唄,幹嘛那麼嚴肅?

michelle_lai529 2010-06-09 01:02 PM

引用:
作者darkangel
呵, 你說的很正確, 其實我覺得會動最重要, 真的在用時, 我也不在乎 if 跟 switch.
我只是看那個半瓶水不爽要要噹他而已, 誰叫他在別的討論串嗆我, 我沒那麼閒~

所以外行跟內行決定在有沒有在別的討論串嗆到對方...... :jolin: :jolin: :jolin:

darkangel 2010-06-09 01:02 PM

引用:
作者ganlingyang
6 int i=rand();

最優化就不能直接丟結果了、if 和 switch 都會變成 cmp 和 jne :like:


就說你內行的, 所以我沒說一定是說通常啊 :like: :like: :like:

darkangel 2010-06-09 01:08 PM

引用:
作者michelle_lai529
所以外行跟內行決定在有沒有在別的討論串嗆到對方...... :jolin: :jolin: :jolin:


在 PCDVD 這麼多年, 我對別人都很忍讓, 但是這個傢伙一直對我的發言指指點點讓我非常不爽, 在我眼裡, 他真的是外行, 這世界上沒有人什麼都懂的, 我也不是什麼高手, 每個人都有每個人擅長跟不會的地方.
但是我們真的不懂, 就要謙虛點, 別老愛裝得很懂的樣子對人指指點點, 結果根本就是錯的.
反正他惹到的人應該也不止我一個, 你應該常看到有人罵他.

michelle_lai529 2010-06-09 01:19 PM

引用:
作者darkangel
在 PCDVD 這麼多年, 我對別人都很忍讓, 但是這個傢伙一直對我的發言指指點點讓我非常不爽, 在我眼裡, 他真的是外行, 這世界上沒有人什麼都懂的, 我也不是什麼高手, 每個人都有每個人擅長跟不會的地方.
但是我們真的不懂, 就要謙虛點, 別老愛裝得很懂的樣子對人指指點點, 結果根本就是錯的.
反正他惹到的人應該也不止我一個, 你應該常看到有人罵他.

就本討論串而言,我是真的認為程式撰寫本身的優雅跟易讀性高過那xxxxx微秒的效能,尤其樓主算是語言的新手,以後說不定也是在這個業界打滾,實在不應該讓他覺得撰寫時要偏執到計較編譯後多幾個命令。
程式設計這個圈子比較封閉,很難跟外人討論,有問題了也只能圈子內的互相幫忙,實在不想看到互貼內行外行的標籤。
是以本討論串而言,其他討論串歸其他討論串。


所有的時間均為GMT +8。 現在的時間是08:27 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。