精華區beta Programming 關於我們 聯絡資訊
※ 引述《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