gcc编译优化

优化选项

-flto

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

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

-flto=thin

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

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

你可能感兴趣的:(c,环境配置,c++)