c++ - 如何实现内存堆

标签 c++ c memory heap-memory allocation

不完全确定如何表达标题,但问题是:

我听说程序员会在程序开始时分配一大块连续内存,然后根据需要进行处理。这与每次需要内存时都简单地访问操作系统相反。 我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本。

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

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

最佳答案

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

如果您想提高性能,周围有许多改进的分配器,您可以简单地链接并使用它们。例如Hoard ,在一个现已删除的答案中提到了哪些小麦(实际上非​​常好——小麦,你为什么要删除它?)。

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

  • 向操作系统请求一大块内存
  • 保留空闲 block 的链接列表
  • 当分配请求进来时:
    • 在列表中搜索足以满足请求大小的 block 以及旁边存储的一些簿记变量。
    • 为当前请求分割出足够大的 block ,将其余 block 放回空闲列表中
    • 如果没有足够大的 block ,返回操作系统并请求另一个大块
  • 收到解除分配请求时
    • 阅读标题以了解大小
    • 将新释放的 block 添加到空闲列表中
    • (可选)查看紧随其后的内存是否也列在空闲列表中,并将两个相邻的 block 合并为一个更大的 block (称为合并堆)

关于c++ - 如何实现内存堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495990/

相关文章:

c++ - 如何使用 std::make_shared 创建动态大小的缓冲区

c++ - 类型列表上的编译时映射

c - 在 C 中减去两个带符号的 32 位数字时如何检测溢出?

c - 关于编译的问题

c - C 中的字符串问题

memory - Go 内存布局与 C++/C 的比较

c - 在c中多次分配同一变量

c++ - C++ 中 dynamic_cast 运算符的强制必要性

c++ - 如何实现运算符重载?

r - Advanced R 中修改列表的示例