可以调用堆栈内存不足吗?

时间:2012-06-28 21:45:24

标签: memory haskell memory-management recursion callstack

当我在Haskell中编写递归函数时出现了一个问题;任何语言(或只是Haskell)的任何调用堆栈都可以在特定点耗尽内存吗?

谢谢:)

4 个答案:

答案 0 :(得分:3)

你有一个有限的内存,如果调用堆栈上的每个帧都采用非零的字节数(尾调用优化使这个更复杂),你必须能够以足够深的递归耗尽资源。基本逻辑。

那就是说,你能走多远取决于堆栈的实现。如果堆栈是在普通中断堆栈中实现的(由于它与该语言的关联也称为C堆栈),你可用的空间非常有限,足以让小帧变得非常深,但是当帧大小上升时真的有限(更多类型的变量)。并非所有语言都使用中断堆栈,而是将堆栈定位在堆空间(更大)。

答案 1 :(得分:2)

通常堆栈大小在Haskell实现中不是问题,因为它是在C中,因为它是具有非标准虚拟机的函数语言,即它的函数调用不直接映射到进程堆栈帧;它们是托管的,可以在堆上分配(类似Stackless Python)。但是大小是有限的,无论如何都可以给你一个堆栈溢出。

答案 2 :(得分:1)

是的,它可以。它取决于为该特定程序分配给堆栈的资源,但如果它太急切,它最终将以堆栈溢出结束。您可以在wikipedia找到更多信息和示例。

答案 3 :(得分:0)

是。堆栈只是一个内存区域,因此是一个有限的资源,如果你滥用它就会耗尽。在C ++中,这不仅适用于递归,而是在堆栈而不是堆上创建太多或(或太大)的变量。