Re: [闲聊] i++ is undefined behavior?

楼主: dirkc (3781615)   2015-04-25 19:11:43
因为他说用 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
作者: suhorng ( )   2015-04-25 19:46:00
其实应该也只是就跟用 template 有时大小会爆炸一样的状况吧?
楼主: dirkc (3781615)   2015-04-25 19:55:00
嗯,不过原po有特别提到是int的例子,要爆炸挺难的,我想不到
作者: LiloHuang (十年一刻)   2015-04-25 20:34:00
只能说不能小看编译器最佳化的能力 :)
作者: PkmX (阿猫)   2015-04-25 21:19:00
你-O2以后整个for-loop就直接不见了啊 当然一样大= =
楼主: dirkc (3781615)   2015-04-25 22:58:00
只是想强调-O2也不会改变结论,而且缩的是global const

Links booklink

Contact Us: admin [ a t ] ucptt.com