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