如何实现内存堆

Pri*_*ime 20 c c++ memory heap allocation

不确定如何标题,但问题是:

我听说程序员在程序开始时分配大部分连续内存,然后在必要时将其处理掉.这与每次需要内存时简单地访问操作系统形成对比.我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本.

我相信JVM会这样做,维护自己的内存部分,然后从中分配对象.

我的问题是,如何实际实现这一点?

谢谢,dragonwrenn

Ben*_*igt 14

大多数C和C++编译器已经提供了堆内存管理器作为标准库的一部分,因此您根本不需要做任何事情以避免每次请求都触及操作系统.

如果你想提高性能,你可以简单地链接和使用一些改进的分配器.例如,Hoard,在现在删除的答案中提到的小麦(实际上非​​常好 - 小麦,你为什么要删除它?).

如果您想编写自己的堆管理器作为学习练习,以下是它需要执行的基本操作:

  • 从操作系统请求大块内存
  • 保留空闲块的链接列表
  • 当分配请求进来时:
    • 在列表中搜索一个块,该块足够大,可以满足所请求的大小以及一些存储在一起的簿记变量.
    • 为当前请求拆分块的足够大块,将其余部分放回到空闲列表中
    • 如果没有块足够大,请返回操作系统并要求另一个大块
  • 当释放请求进入时
    • 阅读标题以找出大小
    • 将新释放的块添加到空闲列表中
    • 可选地,查看紧接着的内存是否也列在空闲列表中,并将两个相邻的块组合成一个更大的块(称为合并堆)


Eri*_*tin 6

您可以在程序开头分配一大块内存,以满足其需求.然后你必须覆盖new和/或malloc,delete和/或free来从这个缓冲区返回内存.

在实现这种解决方案时,您需要编写自己的分配器(从块中获取源代码),并且最终可能会使用多个分配器,这通常是您首先分配内存池的原因.

默认内存分配器是一个很好的全分配器,但不是所有分配需求的最佳.例如,如果您知道要为特定大小分配大量对象,则可以定义一个分配器,该分配器分配固定大小的缓冲区并预先分配多个以获得一定的效率.