为什么尾部调用优化需要垃圾收集?

Cla*_*diu 1 garbage-collection programming-languages tail-call-optimization

为什么尾部调用优化需要垃圾收集?是因为如果你在一个你想要进行尾调用的函数中分配内存,那么就没有办法进行尾调用并重新获得那个内存?(因此必须保存堆栈,以便在尾调用后,可以回收内存.)

dsi*_*cha 9

像大多数神话一样,这个可能有一点道理.虽然尾部调用优化不需要 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,则编译器无需将指令插入到空闲栏.因此,此功能可以优化为尾调用.

  • @JonHarrop:通常的解决方法是将尸体简单地包裹在{{}`中,并在外面返回。 (2认同)

Meh*_*ari 7

你是从哪里听来的?

即使没有任何垃圾收集器的C编译器也能够优化对其迭代等价物的尾递归调用.