| 上一篇 | 下一篇 |
|---|---|
| 大端和小端,包括区别与系统判断方法 | volatile 和 static 关键字 |
C 语言编译器的优化功能(包括 keil )
1)优化功能简介
C语言编译器的优化主要是在不改变程序逻辑的前提下,让生成的代码运行更快、体积更小或更省资源。
具体来说,优化的作用包括:
1)提升执行速度
- 消除冗余计算(如重复加载变量、无用表达式)。
- 内联小函数(避免函数调用开销)。
- 循环优化(如循环展开、强度削弱)。
- 利用 CPU 特性(如向量化 SIMD 指令)。
例子:
c
int x = a * 2 + a * 2; // 优化后可能变成 x = a * 4;
2)减小程序体积
- 删除未使用的函数或变量(死代码消除)。
- 合并常量、复用指令。
- 使用更紧凑的指令编码。
✅ 适用于嵌入式系统、Bootloader 等对空间敏感的场景。
3)降低功耗 / 提高缓存效率
- 优化内存访问模式,提升缓存命中率。
- 减少分支跳转(如将 if 转为条件传送)。
4)自动利用硬件特性
- 针对目标 CPU 架构(如
-march=native)生成更高效的指令。
⚠️ 注意:
- 优化不能修复逻辑错误,但可能让未定义行为(如野指针、数据竞争)表现不同。
- 高优化级别下,调试困难(变量被优化掉、执行顺序改变)。
volatile、inline asm等关键字会影响优化行为。
2)命令
在 C 语言中,使用主流编译器(如 GCC、Clang、MSVC)时,可通过命令行选项开启优化(自动进行,但要手动显式开启),以下是常见方式:
1. GCC / Clang(Unix/Linux/macOS 常用)
在编译命令中添加 -O 系列选项:
-O0:无优化(默认),便于调试。-O1或-O:基础优化,平衡编译时间和性能。-O2:常用优化级别,启用大多数非空间爆炸性优化(推荐发布版本使用)。-O3:激进优化,包括向量化、内联更多函数等,可能增大代码体积。-Os:优化代码大小,适合嵌入式或内存受限环境。-Ofast:在-O3基础上放宽标准合规性(如忽略 IEEE 浮点规则),追求极致速度。
示例:
c
gcc -O2 main.c -o program
2. MSVC(Microsoft Visual C++,Windows )
使用 /O 选项:
/Od:禁用优化(默认 Debug 模式)。/O1:优化代码大小。/O2:优化速度(Release 模式默认)。/Ox:启用常用速度优化(类似/O2的子集)。
示例(在 Developer Command Prompt 中):
c
cl /O2 main.c
注意事项:
- 调试时建议用
-O0,否则变量可能被优化掉,断点行为异常。 - 高优化级别可能暴露未定义行为(如未初始化变量、竞态条件)。
- 某些优化(如
-O3、-Ofast)可能导致数值计算精度变化,需谨慎用于科学计算。
3)keil 的编译器优化
Keil 使用的编译器是 ARM Compiler(如 Arm Compiler 5 或 Arm Compiler 6),也具有优化功能,可在 "Options for Target..." 选项卡中查看:

下面的三个选项:
Optimize for Time(时间优先,速度更快),剩下两个是高级优化,暂时不用了解。