我在 Haskell 中编写递归函数时出现了一个问题;任何语言(或只是 Haskell)的任何调用堆栈都可以在特定点耗尽内存吗?
谢谢 :)
我在 Haskell 中编写递归函数时出现了一个问题;任何语言(或只是 Haskell)的任何调用堆栈都可以在特定点耗尽内存吗?
谢谢 :)
您的内存量是有限的,并且如果调用堆栈上的每一帧都占用非零字节数(尾调用优化使这有点复杂),您必须能够通过足够深的递归耗尽资源. 基本逻辑。
也就是说,你能走多远取决于堆栈的实现。在普通中断堆栈(也称为 C 堆栈,因为它与该语言的关联)中实现堆栈的地方,可用空间非常有限,足以在小帧中获得相当深的空间,但当帧大小增加时确实受到限制(具有更多更大类型的变量)。并非所有语言都使用中断堆栈,而是将它们的堆栈定位在堆空间中(大得多)。
通常堆栈大小在 Haskell 实现中不像在 C 中那样成为问题,因为它是一种具有非标准虚拟机的函数式语言,即它的函数调用不直接映射到进程堆栈帧;它们是托管的,可以在堆上分配(类似于 Stackless Python)。但是大小是有限的,无论如何都会给你一个堆栈溢出。
是的,它可以。这取决于为该特定程序分配给堆栈的资源,但如果过于急切,最终会以堆栈溢出结束。您可以在wikipedia上找到更多信息和示例。
是的。堆栈只是一个内存区域,因此是一种有限资源,如果滥用它可能会耗尽。在 C++ 中,这不仅适用于递归,还适用于在堆栈而不是堆上创建太多或(或太大)的变量。