1、gcc -O的作用
GCC 提供的 -O
系列选项用于优化代码。这些选项可以控制编译器对代码进行优化的程度和类型,从而提高代码的性能、减小代码体积或优化其他特性。
2、gcc -Og -O0 -O1 -O2 -O3 -Os
2.1 gcc -Og
- 启用调试友好的优化,平衡调试器功能与性能之间的关系。
- 不会进行复杂的代码重排,保留了源代码和生成代码的对应关系。
2.2 gcc -O0
- 不进行任何优化。
- 编译速度最快。
- 生成的目标代码直接反映源代码的逻辑顺序。
- 源代码与机器指令一一对应,适合调试。
2.3 gcc -O1
- 特点:
- 开启基本优化,改进程序的性能和代码质量。
- 优化不会显著增加编译时间。
- 不会对代码做复杂重排,因此仍然适合调试。
- 优化类型:
- 删除无用代码(Dead Code Elimination)。
- 合并常量(Constant Merging)。
- 简单的表达式优化(Simple Expression Simplification)。
- 减少寄存器使用(Register Usage Reduction)。
2.4 gcc -O2
- 特点:
- 启用 GCC 提供的绝大多数优化选项(不包括占用大量时间或可能不稳定的优化)。
- 生成高效代码,适合用于生产环境。
- 会显著增加编译时间,可能会使调试更困难。
- 优化类型:
- 启用
-O1
中的所有优化。 - 循环优化(Loop Optimization)。
- 指令调度(Instruction Scheduling)。
- 减少分支跳转(Branch Prediction)。
- 移除不必要的变量复制(Variable Copy Elimination)。
- 启用
2.5 gcc -O3
- 特点:
- 启用所有可以提升性能的优化选项,包括一些更激进的优化。
- 可能会增加代码体积,并且有时会导致调试器难以正确工作。
- 优化类型:
- 启用
-O2
中的所有优化。 - 函数内联(Function Inlining)。
- 循环展开(Loop Unrolling)。
- 自动向量化(Auto-vectorization)。
- 内存预取(Memory Prefetching)。
- 启用
2.6 gcc -Os
- 在
-O2
的基础上,进一步优化代码体积。 - 移除可能增加代码大小的优化(如循环展开和函数内联)。