※ 引述《noguest.bbs@ptt.cc (guest)》之銘言:
> 使用 const 不會增加 d-cache miss 或 i-cache miss.
> 之前提過了, 如果是常數的話, compiler 會和用 #define 一樣直接
> 以常數代入, 不會有你之前說的要去讀取 memory 的情況. 也就是
> compiler 不會因為是使用 const, 就簡單地直譯成類似 "movl a, %eax"
> 這樣子的組語.
> 最後 compiler 都是把 "b+=a" 那一行編譯成相同的組合語言:
> movl b, %eax
> addl $10, %eax
> movl %eax, b
> 可以注意到, 即使是使用 const, 也不會去讀取 'a' 的值, 因此, 根本不會
> 去影響到 d-cache.
在前數篇文中我已經指出, 在實測後, 兩種方式都不會ref.到memory.
不過不知道為什麼, 產生出來的instruction長度有分別. (我是用VC6測的.)
原因我想要找組語達人來解釋了.
> 綜合以上, 使用 const 不會增加 cache miss, 反而是用 #define 有可能會降低
> 執行效率 (如 string 的情況).
> 至於在 compile time 時 compiler 無法算出 const 或 #define 的值的情形, 如
> 以下的程式:
> main() {
> extern int A;
> extern int B;
> const int D=A+B; /* 或是 #define D (A+B) */
> ...
> }
> 使用 #define 不但會把執行檔變大, 還會增加 i-cache miss 及 d-cache miss, 而
> 且在每一個用到 D 的地方都只是簡單地展開, 要重算一次 D 的值, 不像使用 const
> 重頭到尾只計算一次, 用 #define 是非常地沒有效率, 只有缺點而已.
你舉的是針對const做最佳化的情況, 當然會這樣.
如果A和B本身都是用#define宣告的話, 代入D的只會是compile time運算後
A+B的結果而已. (雖然相信有跑optimization下用const也是有相同的結果)
再說, 我從來都沒有說過在做運算式時#define比const好, 只是單純地
想糾正原發文者想把#define全改成const的想法. 你就不需要把我沒說
的都自動代入了.
> 加上之前提到的用 const 可以有不同的 scope, 幫助 debug, 及 complier 容易偵查
> 到 type mismatch 等優點, 使用 const 的好處是遠大於 #define, 而且在執行速率上
> 只會比 #define 好, 不會比用 #define 差.
前面說過的我就不重覆了.
Btw, 你有沒有想過, 為什麼在Managed code中M$的編譯器是把const宣告
自動變成#define, 而不是把#define宣告變成const?
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: ip-84-126-134-202.rev.dyxnet.com