※ 引述《leicheong (理昌)》之銘言:
> ※ 引述《yyshan (布丁珍奶加椰果)》之銘言:
> > 這和 #ifndef 一點關係也沒有
> > 就算用 #ifndef 還是一樣
> > 只要某個模組用到它
> > 就必須存一份它的複本
> 由於#define的宣告範圍是global的, 而且只是用來「取代」需要取代的
> 地方, 因此不存在複本的事.
每個取代的地方都是複本啊...
#define STRING "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
foo.cpp:
void foo(){
const char* str = STRING;
...
}
bar.cpp:
void bar(){
const char* str = STRING;
...
}
這樣 compile 出來
foo.o 和 bar.o 都會有一份 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
> > 第二點就錯了 體積增大會使 cache hit rate 降低
> 可是, instruction cache的cache miss絕對比data load instruction的
> cache miss影響要嚴重得多.
嗯 其它的 architecture 我是不太清楚啦
不過最常見的 x86 其 L2 cache 是 instruction/data 共用
所以 data 的重覆也會使 instruction hit rate 降低
> 還有, 我也不是要原發文者把const全改成#define.
> 我只要針對他想把source中的#define全換成const的想法發言罷.
可能是我誤解了什麼吧
你剛才不是說...
「不過為效能著想, 也建議在debug完成後把這些const宣告換回#define.」
> > 最簡單的問題
> > 你覺得你寫一支程式以後
> > 就永遠不會再改它嗎?
> > 大部分情況是會吧!
> 但改code/debug時已定義的const/#define label你通常可不會手癢跑去動吧?
但 你會用到它們
原作者之所以會想改
正是因為使用 #define 在 debug 時有許多不方便的地方
> > 當你要加新功能時就須要 debug 了
> > 這時候你還要把 #define 全部換回 const 嗎?
> 要用#define的都用#define define了, 還會換回來嗎?
> 我舉的只是針對他對debug時的不習慣提出的compromise吧.
他的問題是可以解決的
方法就是用 const
用 const 還有許多 #define 沒有的好處
當然把所有 #define 直接換成 const 可能會有一些問題
不過如果正確使用
並不會有你所說的重覆定義問題
而且效能幾乎是沒有差異的
> > 真想要讓程式變快
> > 應該先考慮標準的做法:profiling
> > 然後針對最花時間的部分進行最佳化
> > 而且通常先從演算法的層次開始
> > 像 const/#define 之間的效能差異實在太小
> > 一般人根本不會為了這樣的差異
> 我是不會特意去改, 正於我也不建議原發文者特意去改一樣.
> > 去犧牲程式的維護性
> 維護性... 嗎? 你認為#define是為了甚麼被創造出來的?
> 不是為了它的可讀性嗎?
我的意思當然是和 const 比較
const 具有型別資訊、可以有 scope、不限於內建型別
自然比 #define 更容易維護
#define 當然是為了可讀性而設計的
但易讀的 code 並不等同於易維護的 code
Effective C++ 會把 const/#define 擺在第一條
並非沒有道理
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: arisa.csie.org