不知道有没有人知道gcc禁用tailcall优化的标志。基本上,在尾调用优化中,当被调用函数的返回值通过(通过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堆栈帧的代码,而不是添加新的堆栈帧。
我的公司有一个堆栈展开工具,可以从代码中的任何位置打印出堆栈跟踪。尾调用优化使得堆栈框架消失,这可能会在某种程度上混淆堆栈跟踪。
我正在使用gcc4.3为x86-64编译。
提前感谢!P
发布于 2010-09-10 02:33:41
GCC手册:
-foptimize-sibling-calls
Optimize sibling and tail recursive calls.
Enabled at levels -O2, -O3, -Os.因此,要么使用-O0/-O1编译,要么使用-fno-optimize-sibling-calls编译。
发布于 2010-09-10 02:35:17
未测试:-fno-optimize-sibling-calls
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
https://stackoverflow.com/questions/3679435
复制相似问题