Re: [閒聊] i++ is undefined behavior?
因為他說用 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
→
04/25 19:46, , 1F
04/25 19:46, 1F
→
04/25 19:46, , 2F
04/25 19:46, 2F
→
04/25 19:55, , 3F
04/25 19:55, 3F
推
04/25 20:34, , 4F
04/25 20:34, 4F
→
04/25 21:19, , 5F
04/25 21:19, 5F
→
04/25 22:58, , 6F
04/25 22:58, 6F
→
05/21 15:09, , 7F
05/21 15:09, 7F
→
05/21 15:29, , 8F
05/21 15:29, 8F
討論串 (同標題文章)