似乎内部malloc调用mmap为:
//not 100% correct onlyfor demo purpose
// void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
void *malloc(size_t size){
...
mmap(NULL, size,...);
...
}
所以 作为起始地址的第一个参数malloc传递,因此内核会为映射选择一个合适的虚拟地址,这意味着不一定会在堆区域中创建映射(由指针指示)。
NULLmmapmallocbrk
malloc如果这是真的,这意味着在多次调用后虚拟内存中的每个块之间会有很多间隙,因为每个都malloc返回一个与前一个不连续的新虚拟地址,而这些虚拟地址与 无关brk,所以一次我们释放了一个特定的块,然后我们不能将相邻的空闲块与我们释放的块合并,因为每个块在虚拟内存中不连续,那么这种动态内存分配不是非常低效吗?