Cla*_*diu 1 garbage-collection programming-languages tail-call-optimization
为什么尾部调用优化需要垃圾收集?是因为如果你在一个你想要进行尾调用的函数中分配内存,那么就没有办法进行尾调用并重新获得那个内存?(因此必须保存堆栈,以便在尾调用后,可以回收内存.)
像大多数神话一样,这个可能有一点道理.虽然尾部调用优化不需要 GC ,但在少数情况下肯定会有所帮助.假设你在C++中有这样的东西:
int foo(int arg) {
// Base case.
vector<double> bar(10);
// Populate bar, do other stuff.
return foo(someNumber);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,返回foo(someNumber); 看起来像一个尾调用,但因为你正在使用RAII内存管理,并且你必须释放bar,这一行将转换为更低级别,如下所示(在非正式伪代码中):
ret = foo(someNumber);
free(bar);
return ret;
Run Code Online (Sandbox Code Playgroud)
如果您有GC,则编译器无需将指令插入到空闲栏.因此,此功能可以优化为尾调用.