zoukankan      html  css  js  c++  java
  • 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 

      

  • 相关阅读:
    search方法的使用
    边界字符的使用
    重复数量限定符
    常用匹配符
    使用JS快速读取TXT文件
    基于jq和纯js的 读取本地.txt文件的方法
    Linux中的du和df命令
    HSSFWorkbook
    el表达式
    eclipse 导入web项目时常见错误
  • 原文地址:https://www.cnblogs.com/weiweishuo/p/2951207.html
Copyright © 2011-2022 走看看