纬度分为以下几类:
(图片来源网络,侵删)
方法的话一般有以下几类:
精简操作指令尽量满足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编译优化的几个纬度和方法以及注意事项)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...