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 

  

原文地址:https://www.cnblogs.com/weiweishuo/p/2951207.html