在级别 2 优化
级别 2 的权益
- 消除冗余代码
- 执行 基本循环优化
- 结构 代码以利用 -qarch 和 -qtune 设置
在使用 -O0成功编译,执行和调试应用程序之后,在 -O2 上重新编译会将应用程序打开到适用于子程序或编译单元作用域的一组全面的低级别变换,并且可以包含一些直接插入的转换。 -O2 上的优化在提高性能之间实现了相对平衡,同时限制了对编译时间和系统资源的影响。 您可以通过为 -qmaxmem 选项提供更大的值来增加可用于 -O2 产品服务组合中某些优化的内存。 指定 -qmaxmem=-1 将允许优化器根据需要使用内存,而不检查限制,但不会更改优化器应用于应用程序的变换 ( -O2)。
在C语言中,编译时使用 -qlibansi 除非您的应用程序定义的函数与库函数同名。 如果迂到 -O2问题,请考虑使用 -qalias=noansi 而不是关闭优化。
此外,请确保 C 代码中的指针遵循以下类型限制:
- 通用指针可以是
char*或void*。 - 将所有共享变量和指针标记为共享变量
volatile。

开始调整 O2
在 -O2 和更高版本上,选择正确的硬件体系结构目标或目标系列变得更为重要。 通过以正确的硬件为目标,优化器可以最佳地使用可用的硬件设施。 如果选择硬件目标系列,那么 -qtune 选项可以指示编译器发出与体系结构选项一致的代码 ,并且可以 在所选调整硬件目标上最佳执行。 通过此选项,您可以针对一组常规目标进行编译 , 使代码在特定目标上运行最佳。
有关 -qarch 和 -qtune 选项的详细信息,请参阅 “为您的系统架构进行调优 ”。
-O2 选项可以执行许多其他优化,如下所示:
- 公共子表达式消除: 消除冗余指令
- 常量传播: 在编译时对常量表达式求值
- 失效代码消除: 消除特定控制流未达到或生成未使用结果的指令
- 死存储器消除: 消除不必要的变量分配
- 全局寄存器分配: 全局将用户变量分配给寄存器
- 值编号: 通过消除冗余计算来简化代数表达式
- 目标机器的指令调度
- 循环解滚和软件流水线
- 将循环不变量代码移出循环
- 简化控制流程
- 降低强度和有效使用寻址模式
- 拓宽: 合并相邻的负载/存储和其他操作
- 用于增强其他优化的指针别名判别改进
即使使用 -O2 优化,如果指定 -g,也会向调试器提供有关源代码的一些有用信息。 使用更高的 -g 级别会增加提供给调试器的信息,但会减少可以执行的优化。 相反,更高的优化级别可以将代码转换到调试信息不再准确的程度。