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

新手上路,请多包涵

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

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

更新:我的意图可能不清楚,我 不想 在堆栈上分配巨大的对象,我 不需要 更大的堆栈。这个问题纯属好奇!

原文由 undu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 587
2 个回答

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

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

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

原文由 user1202136 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您可以有一个无限堆栈,那么每个虚拟地址都可能被堆栈使用。如果堆栈可以使用每个地址,那么堆就没有地方可去。您为堆变量选择的每个地址都可能被不断增长的堆栈覆盖。

换句话说,栈上的变量和堆上的变量占用同一个虚拟地址空间。我们需要某种方法来防止堆分配器在堆栈可能增长的地方分配数据。堆栈大小是一种简单的方法。堆分配器知道堆栈地址已被占用,因此它使用其他东西。

原文由 user2881022 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏