当相同的代码使用完全禁用优化(
例如,编译器可以: 这两个优化使代码在不影响原始源代码完整性的情况下运行得更快。任何没有这些优化的代码都将在启用它们的情况下运行。
但是,编译器优化也可能会影响代码逻辑。以下是我知道的两个示例:
因此,我想知道,是否还有其他情况下C++编译器优化将影响代码逻辑?我特别寻找关于g ++编译器下的C ++11(没有任何未定义行为)的信息,但是欢迎其他编译器的提示。
g++ -O0
)编译,然后再次使用完全启用优化(g++ -O3
)编译时,源代码本身的逻辑如何更改?例如,编译器可以: 这两个优化使代码在不影响原始源代码完整性的情况下运行得更快。任何没有这些优化的代码都将在启用它们的情况下运行。
但是,编译器优化也可能会影响代码逻辑。以下是我知道的两个示例:
- 从临时对象中删除复制构造函数和赋值运算符可能会删除可能的副作用。
- 重新排列包含浮点值的算术运算可能会影响浮点误差(希望需要
-ffast-math
参数)。
因此,我想知道,是否还有其他情况下C++编译器优化将影响代码逻辑?我特别寻找关于g ++编译器下的C ++11(没有任何未定义行为)的信息,但是欢迎其他编译器的提示。