【问题标题】:Are stack and heap variably sized?堆栈和堆的大小是否可变?
【发布时间】:2021-03-15 23:57:12
【问题描述】:

根据许多消息来源,stackheap 是由空白空间划分的内存区域。据我所知,堆栈和堆在程序运行时会相互增长。

这是否意味着stackheap 的大小都是可变的?如果是,它们中的一个是否可以占用上一次运行期间另一个占用的相同地址(假设两次运行发生在相同的内存地址)?

如果它们的大小可变,我猜stack overflow 会在stack 尝试获取属于heap 的东西时出现。如果没有,stack bound 就是它的本来面目,并放置在两个内存区域之间的初始空白空间中间的某个位置。

澄清一点:这里的大小可变性是指更改保留空间。也就是说,这里我的意思是如果stack 的大小是可变的,则为其保留的空间会发生变化(例如,当您使用realloc 更改数组的大小时,但这只是为了比较);然后,stack overflow 会在堆栈达到某个界限时发生,无论是另一个区域,如 heap 还是其他区域。如果不可变,则保留空间保持不变,stack overflow 仅仅是保留空间用完引起的。而且我还想知道heap 的大小是否也是可变的。

【问题讨论】:

  • 您所描述的架构非常简单,对于现代(PC)系统来说并不是真正的实际,这些系统具有虚拟内存并且可以具有由千兆字节未映射空间分隔的不同内存区域,因此没有办法溢出堆栈,以便它会到达堆。
  • 许多实现在不同区域之间都有保护页面,旨在捕获从一个区域到另一个区域的任何溢出/下溢。
  • 好的,但是它们的大小是可变的吗?

标签: c stack heap-memory


【解决方案1】:

堆栈在地址空间中必须是连续的。堆没有这样的约束。除此之外的任何事情都取决于给定平台如何布置内存。

如果你的地址空间不能有空洞,嵌入式设备的简单布局可以是:从地址 n 及以下为堆栈(堆栈趋于向下增长),从 n 及以上可用于堆。然后静态是一些高地址,代码在 ROM 中。

Linux 和 Windows 在带有 MMU 的平台上运行,因此在内存安排方面有更多选择。

【讨论】:

  • 可以拆分堆栈。编译器只需要生成正确的代码。
  • 不是我的意思。您提到堆栈趋于向下增长增长意味着什么?是堆栈中保留空间的数量发生变化,还是只是其使用内容的大小增加而保留空间保持不变?
  • 使用过的内容。保留空间在没有操作系统支持的情况下是固定的。
  • @doron 那么stack overflow 是不是因为这个保留空间用完了? heap 也是固定的吗?
  • 是的。堆更灵活一些,但它们也可能会耗尽内存并返回空地址。
猜你喜欢
  • 2011-03-22
  • 2021-04-07
  • 2021-03-26
  • 1970-01-01
  • 2019-04-13
  • 2015-12-11
  • 2011-01-04
  • 2013-11-04
  • 2019-03-23
相关资源
最近更新 更多