看板 C_and_CPP 關於我們 聯絡資訊
因為他說用 macro 檔案比較大,舉一個反例滿容易的 簡單的實驗 size1.cpp: #define A 100000 int main() {for(int i = 0; i < A; ++i);} size2.cpp: int const A = 100000; int main() {for(int i = 0; i < A; ++i);} 編譯,先不最佳化: g++ size1.cpp -o size1 g++ size2.cpp -o size2 objdump 出來兩個的 main 長一樣 00000000004004ed <main>: 4004ed: 55 push %rbp 4004ee: 48 89 e5 mov %rsp,%rbp 4004f1: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%rbp) 4004f8: eb 04 jmp 4004fe <main+0x11> 4004fa: 83 45 fc 01 addl $0x1,-0x4(%rbp) 4004fe: 81 7d fc 9f 86 01 00 cmpl $0x1869f,-0x4(%rbp) 400505: 7e f3 jle 4004fa <main+0xd> 400507: b8 00 00 00 00 mov $0x0,%eax 40050c: 5d pop %rbp 40050d: c3 retq 40050e: 66 90 xchg %ax,%ax 從4004fe看來字面常數和global const都被編在$0x1869f的位址 從4004f1到400505可以看出for迴圈確實有編譯出來,並沒有被省略 再來看輸出檔案大小 $ ll size* -rwxrwxr-x 1 ... ... 8463 4月 25 18:54 size1* -rw-rw-r-- 1 ... ... 58 4月 25 18:54 size1.cpp -rwxrwxr-x 1 ... ... 8463 4月 25 18:55 size1-o* -rwxrwxr-x 1 ... ... 8493 4月 25 18:53 size2* -rw-rw-r-- 1 ... ... 62 4月 25 18:53 size2.cpp -rwxrwxr-x 1 ... ... 8463 4月 25 18:55 size2-o* 看來 size2 比 size1 大一點 (8493 v.s 8463) 如果 g++ -O2 最佳化加上去,出來 size1-o 和 size2-o,大小都是 8463 當然這不能代表所有的例子,只是作為一個反例,證明他說的是錯的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.249.182.6 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429960306.A.66A.html
suhorng: 其實應該也只是就跟用 template 有時大小會爆炸一樣 04/25 19:46
suhorng: 的狀況吧? 04/25 19:46
dirkc: 嗯,不過原po有特別提到是int的例子,要爆炸挺難的,我想不到 04/25 19:55
LiloHuang: 只能說不能小看編譯器最佳化的能力 :) 04/25 20:34
PkmX: 你-O2以後整個for-loop就直接不見了啊 當然一樣大= = 04/25 21:19
dirkc: 只是想強調-O2也不會改變結論,而且縮的是global const 04/25 22:58
anyoiuo: http://ims.tw/archives/646 05/21 15:09
anyoiuo: 如果真要比較記憶體大小,這真就不好模擬了 05/21 15:29