在堆上分配内存时,唯一的限制是可用 RAM(或虚拟内存)。它使 Gb 的内存。
那么为什么堆栈大小如此有限(大约 1 Mb)?什么技术原因阻止您在堆栈上创建非常大的对象?
更新:我的意图可能不清楚,我 不想 在堆栈上分配巨大的对象,我 不需要 更大的堆栈。这个问题纯属好奇!
原文由 undu 发布,翻译遵循 CC BY-SA 4.0 许可协议
在堆上分配内存时,唯一的限制是可用 RAM(或虚拟内存)。它使 Gb 的内存。
那么为什么堆栈大小如此有限(大约 1 Mb)?什么技术原因阻止您在堆栈上创建非常大的对象?
更新:我的意图可能不清楚,我 不想 在堆栈上分配巨大的对象,我 不需要 更大的堆栈。这个问题纯属好奇!
原文由 undu 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您可以有一个无限堆栈,那么每个虚拟地址都可能被堆栈使用。如果堆栈可以使用每个地址,那么堆就没有地方可去。您为堆变量选择的每个地址都可能被不断增长的堆栈覆盖。
换句话说,栈上的变量和堆上的变量占用同一个虚拟地址空间。我们需要某种方法来防止堆分配器在堆栈可能增长的地方分配数据。堆栈大小是一种简单的方法。堆分配器知道堆栈地址已被占用,因此它使用其他东西。
原文由 user2881022 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
我的直觉如下。栈不像堆那么容易管理。堆栈需要存储在连续的内存位置。这意味着您不能根据需要随机分配堆栈,但您至少需要为此目的保留虚拟地址。保留的虚拟地址空间越大,可以创建的线程就越少。
例如,一个 32 位的应用程序一般有 2GB 的虚拟地址空间。这意味着如果堆栈大小为 2MB(默认为 pthreads),那么您最多可以创建 1024 个线程。这对于 Web 服务器等应用程序来说可能很小。例如,将堆栈大小增加到 100MB(即,您保留 100MB,但不必立即将 100MB 分配给堆栈),会将线程数限制为大约 20,即使对于简单的 GUI 应用程序也可能会受到限制。
一个有趣的问题是,为什么我们在 64 位平台上仍然有这个限制。我不知道答案,但我假设人们已经习惯了一些“堆栈最佳实践”:小心在堆上分配大对象,如果需要,手动增加堆栈大小。因此,没有人发现在 64 位平台上添加“巨大的”堆栈支持很有用。