GCC编译优化级别:O1/O2/O3/Ofast/Og详解
请详细解释 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(谨慎评估)。