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

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

admin 2025-11-08 社会资讯 21 次浏览 0个评论

纬度分为以下几类:

gcc优化编译(GCC编译优化的几个纬度和方法以及注意事项)
(图片来源网络,侵删)
编译时间目标文件长度执行效率

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

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

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

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

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

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

转载请注明来自海坡下载,本文标题:《gcc优化编译(GCC编译优化的几个纬度和方法以及注意事项)》

每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,21人围观)参与讨论

还没有评论,来说两句吧...