理解优化程序中的不同结果
以下是优化程序可能从未经过优化过程的程序产生不同结果的一些原因:
- 如果程序包含无效代码,那么优化代码可能会失败。 优化过程依赖于符合语言标准的应用程序。
- 如果在优化时未进行优化的程序失败,请检查交叉引用列表和程序的执行流程,以查找在初始化之前使用的变量。 使用 -qinitauto=hex_value 选项进行编译,以尝试一致地生成不正确的结果。 例如,使用 -qinitauto=FF 为变量提供初始值 "负不是数字" (-NAN)。 对这些变量的任何操作也将生成 NAN 值。 其他位模式 (hex_value) 可能会产生不同的结果,并提供有关正在执行的操作的更多线索。 由于编译器所做的缺省假设,具有未初始化变量的程序在未优化的情况下编译时可以正常工作,但是 此类程序可能会 在您优化时失败。 类似地,程序在优化后可以显示为正确执行,但在较低优化级别或在不同环境中运行时失败。 您还可以使用 -qcheck=unset 选项来检测未初始化或可能未初始化的变量。
- 在拥有函数超出作用域后按其地址引用自动存储器变量会导致对内存位置的引用,在调用新函数时,当其他自动变量进入作用域时,会覆盖该内存位置。
使用依赖于检查存储器中的值的谨慎调试技术, 除非 -g8 或 -g9 选项生效并且优化级别为 -O2。 编译器可能已删除或移动公共表达式求值。 它可能已为寄存器分配了一些变量,以便它们完全不会出现在存储器中。