【问题标题】:Can call stack run out of memory?调用堆栈会耗尽内存吗?
【发布时间】:2012-06-30 11:42:24
【问题描述】:

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

谢谢:)

【问题讨论】:

  • 这个网站的名称可能具有指导意义。
  • 我觉得这个问题很讽刺。

标签: memory haskell memory-management recursion callstack


【解决方案1】:

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

也就是说,你能走多深取决于堆栈的实现。在普通中断堆栈(也称为 C 堆栈,因为它与该语言的关联)中实现堆栈的地方,您的可用空间非常有限,足以用小帧获得相当深的空间,但当帧大小增加时非常有限(具有更多更大类型的变量)。并非所有语言都使用中断堆栈,而是将它们的堆栈定位在堆空间中(大得多)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2011-05-28
          • 1970-01-01
          • 2020-02-10
          • 1970-01-01
          • 1970-01-01
          • 2019-02-11
          相关资源
          最近更新 更多