使用mmap
(使用MAP_PRIVATE和MAP_ANONYMOUS)分配内存比使用malloc
有什么缺点?对于函数范围内的数据,无论如何我都会使用堆栈内存,因此不是malloc.
我们想到的一个缺点是动态数据结构,例如树和链表,您经常需要分配和释放小块数据。使用mmap
会有两个原因造成的代价很高,一个用于分配4096字节的粒度,另一个用于要求进行系统调用。
但在其他情况下,您认为malloc
是否优于mmap
?其次,我是否过高估计动态数据结构的mmap
的劣势?
mmap
超过malloc
的一个优势我可以想到,当你执行munmap
时,内存会立即返回到操作系统,而对于malloc/free
,我猜内存uptil数据段断点永远不会返回,但保留重用。
答案 0 :(得分:27)
是的,malloc
优于mmap
。它更容易使用,更细粒度和更便携。最后,无论如何都会调用mmap
。
如果您开始使用mmap
进行日常内存管理,那么您需要实现某种方式,以较小的块而不是页面来分配它,并最终重新实现malloc
- 在次优内方式,可能。
答案 1 :(得分:19)
首先,mmap()
是一个特定于平台的构造,所以如果你计划编写可移植的C,它已经出来了。
其次,malloc()
基本上是根据mmap()
实现的,但它是一种围绕系统调用的智能库包装器:它将在需要时从系统请求新内存,但在此之前它将在已经致力于该过程的区域中选择一块内存。
因此,如果您想进行普通的动态内存分配,请使用malloc()
,故事结束。使用mmap()
进行内存分配应该保留用于特殊情况(例如,如果你真的想要自己整页,在页面边界对齐),并且总是抽象成一段库代码,以便其他人可以轻松了解你在做什么。
答案 2 :(得分:3)
mmap
具有malloc
不具有的一个功能mmap
允许您使用巨大页面进行分配(标志参数设置为MAP_HUGETLB
),而malloc
1}}没有那个选项。