※ 引述《yyshan (布丁珍奶加椰果)》之銘言:
> 每個取代的地方都是複本啊...
> #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"
哦, 你說的是在不同的地方使用時的複本啊.
是的. 當然會這樣. :)
也因為這個原因, 你在C++本身帶來的header檔中不會見到它
#define char* type的. :P
> 嗯 其它的 architecture 我是不太清楚啦
> 不過最常見的 x86 其 L2 cache 是 instruction/data 共用
> 所以 data 的重覆也會使 instruction hit rate 降低
同樣的, 其他architecture我也不清楚, 不過
據我所知P4和K8在L1 cache時instruction和data的cache是分開存放的.
因為這樣CPU比較容易管理. :)
> > 還有, 我也不是要原發文者把const全改成#define.
> > 我只要針對他想把source中的#define全換成const的想法發言罷.
> 可能是我誤解了什麼吧
> 你剛才不是說...
> 「不過為效能著想, 也建議在debug完成後把這些const宣告換回#define.」
「這些const」是指「為了debug方便而轉成const的#define宣告」吧.
> > 但改code/debug時已定義的const/#define label你通常可不會手癢跑去動吧?
> 但 你會用到它們
> 原作者之所以會想改
> 正是因為使用 #define 定義的常數
> 在 debug 時有許多不方便的地方
嗯, 不過我想補充一點.
就是通常用#define的, 不會是常變動的東西.
例如API中用到的各常數, 是不能也不會隨便變動的.
基本上寫完了, 確定數值正確後就會扔在一邊, 也不會計較真正
的值是甚麼了.
> > 要用#define的都用#define define了, 還會換回來嗎?
> > 我舉的只是針對他對debug時的不習慣提出的compromise吧.
> 他的問題是可以解決的
> 方法就是用 const
> 用 const 還有許多 #define 沒有的好處
> 當然把所有 #define 直接換成 const 可能會有一些問題
> 不過如果正確使用
> 並不會有你所說的重覆定義問題
> 而且效能幾乎是沒有差異的
的確. 只要懂得正確的使用方法就好.
> > 維護性... 嗎? 你認為#define是為了甚麼被創造出來的?
> > 不是為了它的可讀性嗎?
> 我的意思當然是和 const 比較
> const 具有型別資訊、可以有 scope、不限於內建型別
> 自然比 #define 更容易維護
> #define 當然是為了可讀性而設計的
> 但易讀的 code 並不等同於易維護的 code
> Effective C++ 會把 const/#define 擺在第一條
> 並非沒有道理
嗯. 雖然我不覺得#define有特別難用, 但可能只是因為習慣了吧.
也同意你說的有道理.
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: 218.189.129.98