为什么堆栈内存大小如此有限?

当您在堆上分配内存时,唯一的限制是可用RAM(或虚拟内存)。 它使Gb的记忆。

那么为什么堆栈大小如此有限(大约1 Mb)呢? 什么技术原因阻止你在栈上创建真正的大对象?

更新 :我的意图可能不明确,我不想在堆栈上分配巨大的对象,我不需要更大的堆栈。 这个问题只是纯粹的好奇心。


我的直觉是以下。 堆栈不像堆一样容易管理。 堆栈需要存储在连续的存储位置。 这意味着您不能根据需要随机分配堆栈,但您至少需要为此目的预留虚拟地址。 保留虚拟地址空间的大小越大,可以创建的线程越少。

例如,32位应用程序通常具有2GB的虚拟地址空间。 这意味着如果堆栈大小为2MB(作为pthread中的默认值),则可以创建最多1024个线程。 这对于Web服务器等应用程序来说可能很小。 例如,将堆栈大小增加到100MB(即,您预留了100MB,但不一定将100MB立即分配给堆栈),会将线程数量限制为大约20个,即使对于简单的GUI应用程序,这也可能会受到限制。

一个有趣的问题是,为什么我们仍然在64位平台上有这个限制。 我不知道答案,但我认为人们已经习惯了一些“堆栈最佳实践”:小心地在堆上分配巨大的对象,并在需要时手动增加堆栈大小。 因此,没有人发现在64位平台上添加“巨大”堆栈支持是有用的。


尚未有人提及的一个方面:

有限的堆栈大小是错误检测和遏制机制。

一般来说,C和C ++中堆栈的主要工作是跟踪调用堆栈和局部变量,并且如果堆栈增长超出界限,则几乎总是设计和/或应用程序行为中的错误。

如果堆栈允许增长到任意大,这些错误(如无限递归)只会在操作系统资源耗尽后才会被捕获得很晚。 这可以通过设置堆栈大小的任意限制来防止。 实际尺寸并不重要,除了足够小以防止系统退化之外。


这只是一个默认大小。 如果你需要更多,你可以得到更多 - 通常告诉链接器分配额外的堆栈空间。

拥有大型堆栈的缺点是,如果您创建了多个线程,则每个线程都需要一个堆栈。 如果所有的堆栈分配多MB的,但不使用它,该空间将被浪费。

你必须为你的程序找到合适的平衡点。


有些人,比如@BJovke,相信虚拟内存本质上是免费的。 确实,您不需要拥有支持所有虚拟内存的物理内存。 你必须至少能够给出虚拟内存的地址。

然而,一个典型的32位PC上的虚拟内存的大小是一样的物理内存的大小 - 因为我们只对任何地址的32位,虚拟的或没有。

由于进程中的所有线程共享相同的地址空间,因此必须在它们之间进行分割。 在操作系统发挥作用后,应用程序只剩下2-3 GB。 这个尺寸是物理和虚拟内存的限制,因为没有更多的地址。

链接地址: http://www.djcxy.com/p/80265.html

上一篇: why is stack memory size so limited?

下一篇: Separating Global/Heap/Stack accesses