我不是很确定如何措辞标题,但问题是:
我听说过程序员在程序开始时分配一大段连续的内存,然后根据需要分配它。这与每次需要内存时都向操作系统请求不同。
我听说这样做会更快,因为它可以避免不断向操作系统请求连续的内存块所带来的开销。
我相信JVM正是这样做的,它维护自己的内存部分,然后从中分配对象。
我的问题是,如何实现这个方法?
我不是很确定如何措辞标题,但问题是:
我听说过程序员在程序开始时分配一大段连续的内存,然后根据需要分配它。这与每次需要内存时都向操作系统请求不同。
我听说这样做会更快,因为它可以避免不断向操作系统请求连续的内存块所带来的开销。
我相信JVM正是这样做的,它维护自己的内存部分,然后从中分配对象。
我的问题是,如何实现这个方法?
大多数C和C++编译器已经作为标准库的一部分提供了堆内存管理器,因此您无需采取任何措施来避免每个请求都打到操作系统。
如果要提高性能,有许多改进的分配器可以使用,您只需链接即可。例如,Hoard是一个不错的选择,wheaties在一个已删除的答案中提到过它。
如果想编写自己的堆管理器作为学习练习,需要做以下基本事情:
http://gee.cs.oswego.edu/dl/html/malloc.html
你可以通过阅读其设计说明来学到很多东西。文章中指向malloc.c
的链接已经失效,现在可以在http://gee.cs.oswego.edu/pub/misc/malloc.c找到它。malloc
,那么您会冒所有种类的错误和兼容性问题,因为不同的库(或标准库函数)被链接到“错误版本的malloc
”。malloc
的情况下完成。我建议查找GNU的obstack
和用于固定大小对象的对象池。这些涵盖了专门分配可能具有实际实用性的大多数情况。