GCC编译优化的几个纬度和方法以及注意事项

GCC编译优化的几个纬度和方法以及注意事项纬度分为以下几类 编译时间目标文件长度执行效率方法的话一般有以下几类 精简操作指令尽量满足 CPU 流水线操作通过对程序行为进行猜测 重新调整代码执行顺序充分使用寄存器对简单的调用进行展开提到优化 自然就会想到 O 的开关 GCC 提供了从 O0 O

欢迎大家来到IT世界,在知识的湖畔探索吧!

纬度分为以下几类:

  1. 编译时间
  2. 目标文件长度
  3. 执行效率

方法的话一般有以下几类:

  1. 精简操作指令
  2. 尽量满足CPU流水线操作
  3. 通过对程序行为进行猜测,重新调整代码执行顺序
  4. 充分使用寄存器
  5. 对简单的调用进行展开

提到优化,自然就会想到-O的开关,GCC提供了从O0-O3以及Os的优化级别,你也可以在这个基础之上进行针对性的屏蔽或者添加:

  • O0 – 不做任何优化,这是默认的编译选项(据我了解,-O0其实也是有部分优化的
  • O和O1 – 对程序做部分编译优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化
  • O2 – 比O1更高级,进行更多优化。gcc将执行所有的不包含时间和空间折中的优化。当设置O2的时候,编译器不进行循环展开以及函数内联优化。与O1相比较,O2优化增加了编译时间的基础上,提高了生成代码的执行效率
  • O3 – 在O2的基础上进行更多的优化。使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化
  • Os – 主要针对代码大小的优化。通常各种优化都会打乱程序的结构,让调试工作变得无从着手,并且会打乱执行顺序。依赖内存操作顺序的程序需要做相关处理才能保证程序的正确性

当然也不是说编译优化就都是好的,他也会带来诸多问题:

  1. 调试问题 – 任何级别的优化都会带来代码结构的改变。比如会对分支做合并和消除,对公用子表达式做消除,对循环内load/store操作做替换和更改,都会使你的目标代码的执行顺序变的面目全非,导致调试信息不足
  2. 内存操作顺序改变问题 – 在O2优化后,编译器会对影响操作内存的执行顺序,比如-fschedule-insns允许数据处理时先完成其他的指令, -fforce-mem有可能导致内存和寄存器之间的数据产生类似脏数据的不一致等。对于某些依赖内存操作顺序而记性的逻辑,需要做严格的处理后才能进行优化。比如利用volatile关键字限制变量的操作方式,或者利用barrier迫使CPU严格按照指令序执行。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/126345.html

(0)
上一篇 13分钟前
下一篇 2025年 1月 15日 上午11:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信