C++ 编译器优化如何影响代码逻辑?
当编译同一段代码时,完全禁用优化(C++ 编译器优化如何影响代码逻辑?,c++,c++11,g++,compiler-optimization,C++,C++11,G++,Compiler Optimization,当编译同一段代码时,完全禁用优化(g++-O0),然后再次完全启用优化(g++-O3),如何更改源代码本身的逻辑 例如,编译器可以 及 做 这两种优化使代码执行得更快,而不影响原始源代码的完整性。任何运行时没有这些优化的代码都将在启用这些优化的情况下运行 但是,编译器优化也会影响代码逻辑。以下是我知道的两个例子: 从临时措施中可以消除可能的副作用 重新排列包含浮点值的算术可能会影响浮点错误(希望需要-ffast math参数) 我很惊讶,也很幸运地了解到了这些,因为它们在错误的情况下可能
g++-O0
),然后再次完全启用优化(g++-O3
),如何更改源代码本身的逻辑
例如,编译器可以
- 及
- 做
- 从临时措施中可以消除可能的副作用
- 重新排列包含浮点值的算术可能会影响浮点错误(希望需要
参数)-ffast math
如果这些参数中的任何一个有明显的副作用,那么代码逻辑就会改变,但这是否是一个bug会因情况而异。不要忘记提到,未定义的行为将意味着一切。我相信编译器也可以“不计算”以后永远不会使用的东西。虽然这不会改变代码的逻辑,但如果您正在度量性能,那么这可能是不好的。不过我不确定。@leo说得好!尽管如此,我始终希望使用优化进行编译会执行得更快,因为这是优化器的工作。我认为更简洁地说,是您的问题:假设规则的所有例外情况是什么?@更神秘的是,未定义的行为意味着任何事情都会发生,甚至在程序中出现UB之前。