Optimization level -O0
-O0禁用所有优化。这个优化级别是默认的。使用-O0可以加快编译和构建时间,但是生成的代码比其他优化级别要满。与其他优化级别相比,-O0的代码大小和堆栈使用率明显要高。生成的代码与源代码密切相关,但生成的代码要多得多,包括死代码。
Optimization level -O1
-O1支持编译器中的核心优化。因为这个级别比-O0提供了更好的代码质量,因此它能提供了很好的调试体验。堆栈的使用也在-O0的基础上有所提高。为了获得良好的调试体验,Arm推荐使用此选项。
-O1与-O0的区别是:
- 使能了优化,这可能会降低调试信息的保真度。
- 内联和尾调是启用的,意味着回溯可能不会提供运行函数的堆栈,而这个堆栈可能是在读源代码过程中是被需要的。
- 如果不需要结果,则可能不会在预期的位置调用没有副作用的函数,或者可能会省略该函数。
- 变量的值在不再使用之后可能在其范围内不可用。例如,它们的堆栈位置可能已经被重用。
Optimization level -O2
与-O1相比,-O2具有更高的性能优化。与-O1相比,它增加了很少的新优化,并更改了优化的启发式。这是编译器可能生成向量指令的第一个优化级别。它还会降低调试体验,并可能导致比-O1更大的代码大小。
-O2与-O1的区别是:
- 编译器认为对于内联调用站点有利的阈值将可能会增加;
- 执行的循环展开量可能会增加;
- 可以为简单的循环和独立标量操作的相关序列生成向量指令;