首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在gcc中禁用tailcall优化

如何在gcc中禁用tailcall优化
EN

Stack Overflow用户
提问于 2010-09-10 02:26:12
回答 2查看 3.7K关注 0票数 13

不知道有没有人知道gcc禁用tailcall优化的标志。基本上,在尾调用优化中,当被调用函数的返回值通过(通过return)传递或者函数中没有其他事情发生时,gcc将替换堆栈帧。

也就是说,在

代码语言:javascript
复制
 void main() {
     foo();
 }

 void foo() {
     bar();
 }

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

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

我的公司有一个堆栈展开工具,可以从代码中的任何位置打印出堆栈跟踪。尾调用优化使得堆栈框架消失,这可能会在某种程度上混淆堆栈跟踪。

我正在使用gcc4.3为x86-64编译。

提前感谢!P

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-10 02:33:41

GCC手册:

代码语言:javascript
复制
   -foptimize-sibling-calls
       Optimize sibling and tail recursive calls.

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

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

票数 32
EN

Stack Overflow用户

发布于 2010-09-10 02:35:17

未测试:-fno-optimize-sibling-calls

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3679435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档