当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么尾部调用优化需要垃圾收集?》经验,为你挑选了2个好方法。

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



1> dsimcha..:

像大多数神话一样,这个可能有一点道理.虽然尾部调用优化不需要 GC ,但在少数情况下肯定会有所帮助.假设你在C++中有这样的东西:

int foo(int arg) {
    // Base case.

    vector bar(10);
    // Populate bar, do other stuff.

    return foo(someNumber);
}

在这种情况下,返回foo(someNumber); 看起来像一个尾调用,但因为你正在使用RAII内存管理,并且你必须释放bar,这一行将转换为更低级别,如下所示(在非正式伪代码中):

ret = foo(someNumber);
free(bar);
return ret;

如果您有GC,则编译器无需将指令插入到空闲栏.因此,此功能可以优化为尾调用.


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

2> Mehrdad Afsh..:

你是从哪里听来的?

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

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有