※ 引述《leicheong (理昌)》之銘言:
> ※ 引述《yyshan (布丁珍奶加椰果)》之銘言:
> > 最後,你不覺得 #define 才會讓體積變大嗎?比如說你在 header 中定義
> > 了一個很大的字串,然後在許多不同的模組中使用它,這麼一來馬上就發生
> > 你所說的重覆定義問題。
> 如果寫header的人沒有正確使用#ifndef的話, 是會有重覆定義.
> 不過這也只是使用者使用失當而已.
這和 #ifndef 一點關係也沒有
就算用 #ifndef 還是一樣
只要某個模組用到它
就必須存一份它的複本
> 事實上你所舉的例子也是用const比較方便debug吧, 這點我也同意.
> 不過為效能著想, 也建議在debug完成後把這些const宣告換回#define.
我反對
第一個理由是 const 和 #define 有許多本質上的差別
直接換下去只會讓你的 debug 時間倍增
其它理由下面再說
> 至於你最後舉的問題, 這涉及#define的內容:
> - 如果#define的內容是primitive type(byte, int, long等), #define
> 的空間使用和執行效能是必定高於const的.
> - 如果#define的內容是string的話, 才會出現你說的情況. 不過也只是
> 體積增大了, 不會影響執行效能. (忽略loading time的話)
第二點就錯了 體積增大會使 cache hit rate 降低
> 如原發文者最初打算那樣, 把全部#define換成const的話, 結果肯定是
> 弊多於利的.
最簡單的問題
你覺得你寫一支程式以後
就永遠不會再改它嗎?
大部分情況是會吧!
當你要加新功能時就須要 debug 了
這時候你還要把 #define 全部換回 const 嗎?
真想要讓程式變快
應該先考慮標準的做法:profiling
然後針對最花時間的部分進行最佳化
而且通常先從演算法的層次開始
像 const/#define 之間的效能差異實在太小
一般人根本不會為了這樣的差異
去犧牲程式的維護性
> btw, 其實在primitive type的時候, enum關鍵字也提供了另一種選擇.
遇到 float/double 就沒用了
若真的那麼在意那一點點效能
用傳回常數值的 inline function 也比 #define 要好
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: arisa.csie.org
◆ Modify: 06/05/08 16:04:07 <arisa.csie.org>