如何在gcc中禁用尾调用优化

14

我想知道是否有人知道gcc禁用尾调用优化的标志。在尾调用优化中,当从被调用函数返回值(通过return)或函数内没有其他操作时,gcc将替换栈帧。

也就是说,在

 void main() {
     foo();
 }

 void foo() {
     bar();
 }
 
 void bar() {
     /* at this point in code, the foo() stack frame no longer exists! */    
 }

当 foo 调用 bar 时,gcc 会发出代码,替换 foo 的堆栈帧,而不是添加一个新的堆栈帧。

我的公司有一个堆栈展开器,可以从代码中的任何点打印出堆栈跟踪。尾调用优化会使堆栈帧消失,这可能会使堆栈跟踪有些混乱。

我正在使用 GCC 4.3 编译 x86-64。

2个回答

33

GCC手册:

   -foptimize-sibling-calls
       Optimize sibling and tail recursive calls.

       Enabled at levels -O2, -O3, -Os.

因此,要么使用-O0/-O1进行编译,要么使用-fno-optimize-sibling-calls


13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接