跳到主要内容

3.4 选择优化选项

KF32工具链支持多种优化级别,以控制不同的优化目标。适合您应用程序的最佳优化级别取决于您的应用程序和优化目标。

3.4.1 优化等级介绍​

表3.5 优化等级与优化目标

优化等级优化目标
-O0少量优化
-O2在编译时间、代码体积和运行速度之间取得平衡。
-Os以减小代码体积为首要目标。

开启优化后会改变调试信息和源码关系,可能造成调试体验变差。

优化级别 -O0

-O0会启用一小部分优化。此优化级别是默认设置。KF32R在-O0下默认启用 O0Plus 模式:在启用少量优化的同时保留指令与源码行的对应关系,以获得良好的调试体验。在-O0级别下,代码大小和堆栈使用量略高于其他优化级别。若想强制禁用所有优化,可使用选项 -O0 -native-O0。

优化级别 -O2

-O2在-O0的基础上启用更完整的过程内与过程间优化,在编译时间、代码体积和运行速度之间取得平衡。与-O0相比,-O2会降低调试体验。

使用-O2与使用-O0相比,差异如下:

  • 内联与循环展开等优化被启用,编译器认为内联调用点有利可图的阈值提高。
  • 如果不需要结果,一个没有副作用的函数可能不会在预期的位置被调用,或者可能会被省略。
  • 变量的值在不再使用后,可能在其作用域内无法获取。例如,它们的栈位置可能已被重新使用。
  • 内联和尾调用已启用,这意味着回溯可能不会提供从源代码中预期的开放函数激活栈。

优化级别 -Os

-Os以减小代码体积为首要目标。它以-O2的优化流程为基础,限制或关闭会增加代码体积的优化(如循环展开),并调整内联等优化策略,以可能的执行时间增加换取更小的代码体积。与-O0相比,-Os同样会降低调试体验。