2012-01-15 43 views
20

使用mmap(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存比使用malloc有什么缺点?对于功能范围的数据,我想无论如何,因此使用的堆栈内存不malloc.想到的如果我使用mmap而不是malloc分配内存,该怎么办?

一个缺点是动态的数据结构,例如树和链表,在那里你经常需要分配和释放的小型数据块。使用mmap由于两个原因将会是昂贵的,一个是以4096字节的粒度进行分配,另一个是需要进行系统调用。

但在其他情况下,您认为mallocmmap更好吗?其次,我是否高估了动态数据结构mmap的劣势?

mmap超过malloc我能想到的一个优势是,内存被立即返回到操作系统,当你做munmap,而与malloc/free,我猜内存uptil数据段断点是永远不会回来了,但存放回用。

+9

如果需要,malloc会为你调用mmap ...只需要坚持malloc。 – Macmade 2012-01-15 13:33:59

+2

另一个缺点是,如果你使用'mmap'调用你的代码,它就变得不便携了。 – 2012-01-15 13:35:02

+3

为什么让生活比它需要更复杂? – 2012-01-15 13:37:56

回答

26

是的,mallocmmap好。它使用起来更容易,更精细,更便于携带。最后,无论如何它都会打电话给mmap

如果你开始每天做内存管理与mmap,你要实现比网页更小的块parceling出来的一些方式,你将最终重新实现malloc - 次优的方式,大概。

+1

因为它提到'malloc'调用'mmap',因此深入解答。 – 2016-09-01 09:04:07

17

首先,mmap()是一个平台特定的结构,所以如果你打算编写便携式C,它已经不在了。

其次,malloc()基本上在mmap()方面实现的,但它是一种围绕着系统调用智能库包装的:在需要的时候它就会从系统请求新的内存,但在那之前它会挑一块记忆一个已经投入到这个过程中的领域。

因此,如果你想做普通的动态内存分配,请使用malloc(),故事结束。使用mmap()进行内存分配时,应该保留用于特殊情况(例如,如果实际上需要整个页面,在页面边界对齐),并且始终将其抽象为单个库代码,以便其他人可以轻松理解您的内容,重新做。

+1

即使你确实想为你自己创建一个完整的页面,那么最好使用'posix_memalign',它可以更快地分配,更快地释放,并且将内核从跟踪另一个vma的麻烦中解放出来。真正使用'mmap'的唯一理由是如果你想将一个文件描述符映射到内存中(最常见的用法),或者正在实现一个内存分配器(即使这样也有很好的理由选择'sbrk')。 – jleahy 2013-05-14 20:27:48

3

一个功能,mmapmalloc不,是mmap允许您使用大页面分配(标志参数具有MAP_HUGETLB集),而malloc没有这样的选择。