Memory 调用堆栈是否会耗尽内存?

Memory 调用堆栈是否会耗尽内存?,memory,haskell,memory-management,recursion,callstack,Memory,Haskell,Memory Management,Recursion,Callstack,当我在Haskell中编写递归函数时,出现了一个问题;任何语言(或Haskell)中的任何调用堆栈是否会在特定点耗尽内存 谢谢:)是的,可以。它取决于为该特定程序的堆栈分配的资源,但如果它过于急切,最终将导致堆栈溢出。您将在上找到更多信息和示例。是。堆栈只是一个内存区域,因此是一个有限的资源,如果您滥用它,它可能会耗尽。在C++中,这不仅仅适用于递归,而是在堆栈上创建太多或(或太大)变量而不是堆。 内存有限,如果调用堆栈上的每个帧都取非零字节数(尾部调用优化使得这一点变得更复杂),您必须能够使用

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


谢谢:)

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

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

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


也就是说,您可以深入到多深取决于堆栈的实现。如果堆栈是在普通中断堆栈中实现的(由于与该语言的关联,也称为C堆栈),那么可用的空间就相当有限,足以在小帧的情况下达到相当深的深度,但在帧大小增加时(使用更多的大类型变量)就非常有限。并非所有语言都使用中断堆栈,而是将其堆栈定位在堆空间中(更大)。

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

这个网站的名字可能很有启发性。我发现这个问题很讽刺。