为什么尾部调用优化需要垃圾收集?是因为如果你在一个你想要进行尾调用的函数中分配内存,那么就没有办法进行尾调用并重新获得那个内存?(因此必须保存堆栈,以便在尾调用后,可以回收内存.)
像大多数神话一样,这个可能有一点道理.虽然尾部调用优化不需要 GC ,但在少数情况下肯定会有所帮助.假设你在C++中有这样的东西:
int foo(int arg) { // Base case. vectorbar(10); // Populate bar, do other stuff. return foo(someNumber); }
在这种情况下,返回foo(someNumber); 看起来像一个尾调用,但因为你正在使用RAII内存管理,并且你必须释放bar,这一行将转换为更低级别,如下所示(在非正式伪代码中):
ret = foo(someNumber); free(bar); return ret;
如果您有GC,则编译器无需将指令插入到空闲栏.因此,此功能可以优化为尾调用.
你是从哪里听来的?
即使没有任何垃圾收集器的C编译器也能够优化对其迭代等价物的尾递归调用.