gcc的优化相关
1,gcc默认优化级别是-O0,此级别下生成的汇编代码和c语句之间有较强的对应关系,利于分析程序:
例如这段程序:
1 void main(){ 2 int a=16; 3 float b=(float)a; 4 }
gcc -o tt tt.c -g
main桢对应:
0x080483dc <+0>: push ebp 0x080483dd <+1>: mov ebp,esp 0x080483df <+3>: sub esp,0x10 => 0x080483e2 <+6>: mov DWORD PTR [ebp-0x8],0x10 0x080483e9 <+13>: fild DWORD PTR [ebp-0x8] 0x080483ec <+16>: fstp DWORD PTR [ebp-0x4] 0x080483ef <+19>: leave 0x080483f0 <+20>: ret
中规中举的一段汇编码。
2,但是,-O0下也会做一些基本的优化,例如预先算出常量表达式的结果:
void main(){ int a=16*16; }
对应:
0x080483dc <+0>: push %ebp 0x080483dd <+1>: mov %esp,%ebp 0x080483df <+3>: sub $0x10,%esp => 0x080483e2 <+6>: movl $0x100,-0x4(%ebp) 直接送入变量a地址处的是0x100,即16*16 0x080483e9 <+13>: leave 0x080483ea <+14>: ret
对比一下,as3的编译器实在衰的很,它不会做这种优化的。
3,-O0模式下在编译阶段完成常量的类型转换,例如:
void main(){ int a=(int)8.3; }
对应main桢:
0x080483dc <+0>: push %ebp 0x080483dd <+1>: mov %esp,%ebp 0x080483df <+3>: sub $0x10,%esp 0x080483e2 <+6>: movl $0x8,-0x4(%ebp) 这儿,直接送的是0x8 0x080483e9 <+13>: leave 0x080483ea <+14>: ret
posted on 2013-03-09 10:40 weiweishuo 阅读(252) 评论(0) 编辑 收藏 举报