昆仑-昆仑娱乐-注册登录站

昆仑-昆仑娱乐-注册登录站 咨询热线:

昆仑新闻 >>当前位置: 首页 > 昆仑新闻

GCC编译优化和调试选项

时间:2024-04-22 14:34:54

  • 开启编译优化的开关时,GCC编译器的目的是:优化程序的性能减少代码的大小,尽管会以牺牲编译时间和程序的可调试能力为代价。
  • 对于不同的优化级别开启的对应优化开关可以通过gcc -Q -O2 --help=optimizers来查看对应的开启优化列表。

1. GCC优化选项

  • -O0
    默认的优化选项,减少编译时间和生成完整的调试信息。
  • -O/-O1
    这两个都是开启level 1的编译优化。开启编译优化会导致更长的编译时间,对于大函数还会消耗更多的内存空间。level1的编译优化下,编译器会尝试减少代码段大小和优化程序的执行时间,但不执行需要消耗大量编译时间的优化。
  • -O2
    相比于-O1,-O2打开了更多的编译优化开关
  • -O3
    在-O2的基础上,level 3的级别优化
  • -Os
    优化生成的目标文件的大小
  • -Ofast
    为了提高程序的执行速度,GCC可以无视严格的语言标准。-Ofast会开启所有-O3的编译开关,且会对不符合标准的程序进行优化。
  • -Og
    优化调试信息。相对于-O0生成的调试信息,-Og是为了能够生成更好的调试信息。和-O0一样,-Og选项关闭了很多优化开关。

如果同时使用多个不同level -O优化选项来进行编译,编译器会根据最后一个-O的level来决定采用那种优化级别。

2. GCC 调试选项

GCC允许您将-g与-O配合使用。GCC开启优化编译选项的结果有时可能会令人惊讶:

  • 声明的某些变量可能被删除;
  • 控制流走到您意想不到的位置;
  • 有些语句可能不会执行,因为它们计算的是常量结果或它们的值已经在手边;
  • 有些语句可能会在不同的位置执行,因为它们已经移出了循环。

GCC允许编译时添加额外的调试信息,以便程序进行调试,大部分情况下,你需要编译选项-g就可以满足调试需求。

如果没有使用其他优化选项,请考虑将-Og与-g一起使用。在完全没有-O选项的情况下,一些编译器收集对调试有用的信息根本不会运行,因此-Og可能会带来更好的调试体验。

  • -g0:不生成调试信息,相当于没有使用-g;
  • -g1:生成最小的调试信息,足够在不打算调试的程序中进行堆栈查看。最小调试信息包括函数描述,外部变量,行数表,但不包括局部变量信息。
  • -g2:默认-g的调试级别;
  • -g3:相对-g,生成额外的信息,例如所有的宏定义;

和-O一样,如果多个级别的-g选项同时存在,最后的选项会被生效


综上,很多项目的线上版本都是使用”-O2 -g”的编译选项进行编译,以便发生问题的时候容易定位。但这有一个很大的弊端就是目标文件会比不开启调试信息的情况下大很多,所以一般对外发布的软件都是不含有调试信息的release版本,同时也会发布含有调试信息的debug版本,两者的性能是一样的只是debug多了调试信息而已。GCC编译优化和调试选项综上,很多项目的线上版本都是使用”-O2 -g”的编译选项进行编译,以便发生问题的时候容易定位。但这有一个很大的弊端就是目标文件会比不开启调试信息的情况下大很多,所以一般对外发布的软件都是不含有调试信息的release版本,同时也会发布含有调试信息的debug版本,两者的性能是一样的只是debug多了调试信息而已。

GCC编译优化和调试选项

返回
Copyright © 2012-2018 昆仑-昆仑娱乐-注册登录站  电话:0898-08980898
地址:海南省海口市  ICP备案编号:琼ICP备xxxxxxxx号
找我

全国统一服务热线7*24小时为您在线服务

平台注册入口