精華區beta Programming 關於我們 聯絡資訊
※ 引述《tomhuang (阿培仔)》之銘言: > ※ 引述《leicheong (理昌)》之銘言: > > 是的. > > 因為之後實測出來的結果不是這樣, 因此修正了. > > 對就是對, 錯就是錯. 在知道之前的觀點有偏差後還頑固地說自己是對 > > 的話, 一點意思也沒有. 不是嗎? > 那麼為了板上的人可以有更清楚的觀念,你覺得你有錯的話, > 是不是應該主動說明你說的哪些對哪些錯呢? > 你之前寫的錯的東西,你用很有信心的口氣讓大家覺得那些是對的, > 然而現在發現錯了,又沒有主動做必要的修正,以後來板上看的新手們, > 是不是就要花時間先被你誤導,再看後面的回文慢慢發現你所說的是錯的呢? 的確... 這樣我先整理一下: 1) #define在「數值類型」上表現和const相同, 只是在沒有optimization 的情況下const會多產生幾句instruction. 2) 在VC6下, 不知道為什麼用const宣告時在parameter passing的情況 下會產生較長的push指令.(2 bytes vs. 5 bytes) 3) #define在當宣告的類型為「非數值類型」(例如string)時明顯地在 空間使用效率上不如const, 因為會重複宣告.(#define時每句string 會自動expand成獨立的string而不會共用) 4) 在沒有optimization的情況下, 每一句const即使沒有用到仍會產生 instruction, 做成空間的浪費. (以下為VC7的實測, 單純用"cl test.cpp" 以預設參數compile, 在"const int a=10"後加上"const int c=100") 00401006 |. C745 FC 0A0000>MOV DWORD PTR SS:[EBP-4],0A 0040100D |. C745 F4 640000>MOV DWORD PTR SS:[EBP-C],64 00401014 |. C745 F8 000000>MOV DWORD PTR SS:[EBP-8],0 0040101B |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] 0040101E |. 83C0 0A ADD EAX,0A 00401021 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX 00401024 |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8] 00401027 |. 51 PUSH ECX 而用#define時不會出現這種情況 (因為沒有東西讓它replace) 這是目前為止對討論結果有影響而且已確定正確的部份. -- ※ Origin: SayYA 資訊站 <bbs.sayya.org> ◆ From: ip-84-126-134-202.rev.dyxnet.com