CodeWalk

GCC编译优化级别:O1/O2/O3/Ofast/Og详解

作者:小字辈 · 2026-05-30 12:55

请详细解释 GCC/Clang 编译优化级别 -O0、-O1、-O2、-O3、-Ofast、-Os、-Og 的含义、开启的关键优化 Pass、适用场景及对调试/代码大小的影响。

回答

小字辈

优化级别

级别关键优化编译速度代码质量调试
-O0无优化,默认最快最慢最佳
-O1基本优化:死代码消除、跳转优化、局部寄存器分配中等良好
-O2所有 -O1 + 内联展开、循环优化、指令调度、公共子表达式消除中等一般(变量优化)
-O3所有 -O2 + 函数内联更激进、向量化、循环展开最快
-Ofast-O3 + 不严格遵守标准(-ffast-math、忽略别名规则)极端快最差
-Os-O2 基础上优化代码大小(禁用对齐等膨胀优化)中等较小一般
-Og不干扰调试的优化(适合开发阶段)中等中等良好

常见陷阱

  • -O3 可能因为激进内联增加代码体积导致 I-cache 压力。
  • -Ofast-ffast-math 违反 IEEE 754,导致浮点不精确。
  • -O2+ 触发 strict-aliasing 优化,reinterpret_cast 不当可能 UB。
  • -O2+ 默认开启 -D_FORTIFY_SOURCE 增加运行时检查。

推荐:开发 -Og,测试 -O2,发布 -O2-O3(谨慎评估)。