gcc编译优化

优化选项

-flto

  1. Whole Program Mode(整个程序模式):在这种模式下,编译器对整个程序进行优化。它通过将所有源文件合并成一个单独的中间表示(IR)文件,然后进行全局的优化和代码生成。这种模式可以提供更大的优化空间,因为编译器可以看到整个程序的上下文信息,从而进行更准确的优化。但是,它需要更多的时间和资源来处理整个程序,因此编译时间会增加。

  2. LTRANS(Link-Time Transformer)模式:在这种模式下,编译器对每个源文件进行优化,并将优化后的中间表示(IR)文件保存到目标文件中。最后,链接器将这些目标文件组合在一起,并进行进一步的优化。这种模式对于大型项目来说更具可行性,因为它可以将优化过程分布在多个编译和链接阶段,从而减少了单个编译过程的资源消耗。然而,由于无法全局优化整个程序,它可能无法实现某些全局优化的效果。

-flto=thin

thinLTO是GCC引入的一种折衷方案,它结合了整个程序模式和LTRANS模式的优点. 在链接阶段,链接器可以使用这些索引文件来进行全局的优化和代码生成。它会根据需要只选择需要的函数和变量,而不必处理整个程序。这样既减少了编译时间和资源消耗,又能够实现一定程度的全局优化。ThinLTO模式在大型项目中特别有用,因为它能够提供较好的优化效果,同时还保持了相对较低的编译时间和资源消耗。

这个选项gcc8版本中引入的.  gcc9 或更高的版本已经移除了. 可以使用-fno-fat-lto-objects 以达到类似于 -flto=thin 的效果

LTRANS(Link-Time Transformer)和ThinLTO(Thin Link-Time Optimization)是两种不同的链接时优化(Link-Time Optimization,简称LTO)方式,它们在实现和效果上有一些区别。

  1. 实现方式:

    • LTRANS:LTRANS模式将每个源文件编译为优化后的目标文件,并将这些目标文件保存在最终的可执行文件中。在链接阶段,目标文件之间会进行进一步的优化和代码生成。
    • ThinLTO:ThinLTO模式将每个源文件编译为精简的中间表示(IR)文件,并生成一个索引文件。在链接阶段,链接器根据需要选择并优化相关的函数和变量,而不必处理整个程序。
  2. 优化范围:

    • LTRANS:LTRANS模式对整个程序进行全局优化。由于可以看到整个程序的上下文信息,因此可以进行更准确和全面的优化。但是,这可能导致编译时间和资源消耗增加。
    • ThinLTO:ThinLTO模式只对需要的函数和变量进行优化。通过使用索引文件,在链接阶段选择和优化相关的部分,以减少编译时间和资源消耗。但由于无法全局优化整个程序,某些全局优化的效果可能不如LTRANS模式。
  3. 适用范围:

    • LTRANS:LTRANS模式适用于大型项目,可以提供更高的优化水平。它可以处理整个程序,但可能需要更长的编译时间和更多的资源。
    • ThinLTO:ThinLTO模式在大型项目中也很有用,因为它可以在一定程度上实现全局优化,并减少编译时间和资源消耗。由于它只处理相关的部分,因此在某些情况下,优化效果可能稍逊于LTRANS模式。

总体而言,LTRANS和ThinLTO都是有效的链接时优化方式,但根据项目的规模、编译时间和优化需求来选择适合的模式。LTRANS模式提供了更高的优化水平,而ThinLTO模式则在资源消耗方面更为友好。

-march选项用于指定目标处理器的架构

 -march选项后面可以跟随特定的处理器架构名称,比如-march=core2-march=armv8-a等。这样编译器就会根据目标处理器的架构来选择合适的指令集,并对代码进行相应的优化,以充分利用处理器的功能和特性。

需要注意的是,使用-march选项进行优化时,需要确保目标处理器与编译后的可执行文件运行的环境是匹配的。如果在较新的处理器上进行编译优化,可能会导致生成的可执行文件在较老的处理器上无法正常运行。因此,在选择-march选项时,需要考虑目标处理器的实际环境和要求。

优化等级

O0:无优化。编译器只进行语法检查和生成目标代码,不进行任何优化操作。这种等级通常用于调试和代码分析。

O1优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。如去除未使用的函数、内联简单函数等,以提高执行速度。 

O2会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。 如循环展开、函数调用优化等。这种等级适用于对性能有较高要求的场景。

O3在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。 更激进的内联、更复杂的循环优化等。这种等级适用于对性能要求非常高且可以接受编译时间延长的情况。

Os主要是对代码大小的优化,我们基本不用做更多的关心。 通常各种优化都会打乱程序的结构,让调试工作变得无从着手。并且会打乱执行顺序,依赖内存操作顺序的程序需要做相关处理才能确保程序的正确性。  

Ofast:启用所有级别的优化,并且进一步放宽了一些标准限制。这可能会导致一些非标准行为,因此需要谨慎使用。

OG, 编译加快, 更多的调试信息

-O -W -Wall -Wpointer-arith -Wno-unused-parameter

  • -W:启用所有警告信息。编译器会发出各种警告,以帮助开发者发现潜在的问题或不规范的代码。

  • -Wall:启用额外的警告信息。此选项会开启更多警告,包括一些常见的潜在问题,如未使用的变量或函数、隐式声明等。

  • -Wpointer-arith:启用指针算术运算的警告。该选项会警告指针运算可能导致的错误,如越界访问、空指针操作等。

  • -Wno-unused-parameter:禁用对未使用函数参数的警告。有时候函数的某些参数可能在实现中未被使用,此选项可以避免编译器发出相关的警告信息。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值