【问题标题】:How can it be possible that heap memory takes up more RAM than stack memory? [duplicate]堆内存怎么可能比栈内存占用更多​​的RAM? [复制]
【发布时间】:2019-09-29 12:01:31
【问题描述】:

我正在为我的计算机科学专业学习 C 语言的操作系统课程。

我很好奇这是否与分配内存时浪费的空间有关,以及这是否在任何计算机操作系统上有所不同,并且我了解内存的排列方式可以按任何顺序进行最适合系统。

【问题讨论】:

  • 堆内存通常必须跟踪内存块的大小,以及已用或空闲列表中下一个内存块的位置。因此,如果您分配 1 个字节的堆内存,则总共可能分配 16-32 个字节,具体取决于平台和实现。相比之下,如果你分配 1 字节的堆栈内存,它可能需要 4 字节来保持对齐(也许,但可能不是,8 字节)。
  • 您可以看到内核使用与用户空间程序不同的内存管理功能。您的问题过于宽泛,无法回答 - 但自动存储对象仅限于范围生命周期和堆栈(尤其是内核的大小非常有限)
  • 你需要引用一个参考来支持前提并提供一些上下文。例如,您是在谈论每个对象的总体分配,还是存储每个单独对象所需的空间?
  • 您的课程可能会要求您编写堆管理器?然后你就会明白为什么了。

标签: c stack heap-memory stack-memory


【解决方案1】:

堆分配具有最大对齐 - 通常为 8 个字节,因此单个分配最多“浪费”了 7 个字节以确保对齐。

然后每个分配都包含一个用于堆管理的元数据块。

在某些实现或调试版本中,可能会包含额外的元数据或填充来检测堆错误,例如尝试释放非堆对象或块溢出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2011-06-25
    • 2011-08-15
    • 1970-01-01
    • 2017-01-28
    • 2017-05-16
    • 2013-08-26
    相关资源
    最近更新 更多