用GCC编译-O2选项生成不同的程序

use*_*722 4 c compiler-construction optimization

我听说带有/不带优化选项的C编译器可能会生成不同的程序(用优化编译程序会导致它表现不同),但我从未遇到过这样的情况.任何人都可以给出简单的例子来展示这个

Eri*_*rik 5

对于gcc 4.4.4,这与-O0和不同-O2

void foo(int i) {
  foo(i+1);
}

main() {
  foo(0);
}
Run Code Online (Sandbox Code Playgroud)

通过优化,这将永远循环.没有优化,它崩溃(堆栈溢出!)

其他更现实的变体通常取决于时序,易受浮点精确度变化的影响,或取决于未定义的行为(未初始化的变量,堆/堆栈布局)