4.6 针对代码大小或性能进行优化
KF32工具链会采用多种技术进行代码优化,其中一些技术可提升代码性能,而另一些技术则能减小代码体积。不同的优化存在一定的冲突,也就是说,提高代码性能的技术可能会导致代码体积增大,而减小代码体积的技术可能会降低性能。例如,编译器可以展开小循环以获得更高的性能,但缺点是代码体积会增加。
默认优化级别为 -O0:KF32R 在 -O0 下默认启用 O0Plus 模式,引入少量优化,详见 3.4 选择优化选项。
代码性能优化相关选项:
表4.8 代码性能优化相关选项
| 优化选项 | 作用 |
|---|---|
| -O2 | 在编译时间、代码体积和运行速度之间取得平衡。在 -O0 的基础上启用更完整的过程内与过程间优化,编译时间较 -O0 明显增加。其优化选项详见 3.4 选择优化选项。 |
代码体积优化相关选项:
表4.9 代码体积优化相关选项
| 优化选项 | 作用 |
|---|---|
| -Os | 以代码体积为首要目标,限制或关闭会增加代码体积的优化,以可能的执行时间增加换取更小的代码体积。 |
| -fshort-enums | 允许编译器将枚举类型的大小设置为能够容纳所有枚举值的最小数据类型。 |
| -fno-exceptions | 仅适用于C++。禁用生成支持C++异常所需的代码。 |
| -fno-rtti | 仅支持C++。禁用生成支持运行时类型信息(RTTI)功能所需的代码。 |
此外,在编码过程中所做的选择可能会影响优化。例如:
(1)优化循环终止条件可以同时改善代码大小和性能。特别是,使用计数器递减到零的循环通常比使用递增计数器的循环生成的代码更小、运行更快;
(2)通过减少循环迭代次数来手动展开循环,同时增加每次迭代的工作量,这种方式可以以增大代码规模为代价提升性能;
(3)使用内联函数需要在代码大小和性能之间进行权衡。
4.6.1 优化对调试的影响
开启优化后,编译器会对指令进行重排、合并或删除,目标代码与源代码之间不再保持一一对应关系,调试时看到的位置可能与源码顺序不一致,调试视图也不够直观。可根据实际调试需求合理选择优化等级与优化选项。