不完全确定如何表达标题,但问题是:
我听说程序员会在程序开始时分配一大块连续内存,然后根据需要进行处理。这与每次需要内存时都简单地访问操作系统相反。 我听说这会更快,因为它可以避免不断向操作系统询问连续的内存块的成本。
我相信 JVM 就是这样做的,它维护自己的内存部分,然后从中分配对象。
我的问题是,如何实际实现这一点?
最佳答案
大多数 C 和 C++ 编译器已经提供了堆内存管理器作为标准库的一部分,因此您根本不需要做任何事情来避免每次请求都会影响操作系统。
如果您想提高性能,周围有许多改进的分配器,您可以简单地链接并使用它们。例如Hoard ,在一个现已删除的答案中提到了哪些小麦(实际上非常好——小麦,你为什么要删除它?)。
如果您想编写自己的堆管理器作为学习练习,以下是它需要做的基本事情:
- 向操作系统请求一大块内存
- 保留空闲 block 的链接列表
- 当分配请求进来时:
- 在列表中搜索足以满足请求大小的 block 以及旁边存储的一些簿记变量。
- 为当前请求分割出足够大的 block ,将其余 block 放回空闲列表中
- 如果没有足够大的 block ,返回操作系统并请求另一个大块
- 收到解除分配请求时
- 阅读标题以了解大小
- 将新释放的 block 添加到空闲列表中
- (可选)查看紧随其后的内存是否也列在空闲列表中,并将两个相邻的 block 合并为一个更大的 block (称为合并堆)
关于c++ - 如何实现内存堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495990/