给出Windows平台下的答案: malloc函数最终会请求windows的堆管理器(heap manager)在进程的默认堆上分配内存。堆管理器通过快查链表(look-aside list)管理和分配内存,每条快查链表包含空闲的相同长度的内存。 你可能会问,那整数有无限多个,就要有无限多个快查链表了?当然不会,在32位WINDOWS操作系统上,每个堆有128条快查链表,控制的内存分配长度分别从8字节到1K。如果你要分配1~8字节,实际会分配8字节,要分配1025字节及其以上实际就分配1K...(不完全这样,最后一段有补充) 当堆管理器接受到一个7字节的分配请求,先看看8字节这条快查链表是否为空,如不为空,直接从中取出一项来满足你。如果为空,它就会一下从windows底层分配8n(最后一段会修正)长度的内存,向快查链表插入n项,再取出一项满足你,这样向底层请求的次数少了,系统效率就高了。 另外,堆管理器还会多分配几个字节存储实际分配的内存长度,所以上面7字节的请求实际应该分配8+4=12字节,并返回第5个字节的地址给你(假定以四字节表示长度值,具体要多少位微软也没公布)。当调用free时,也是最终请求堆管理器释放内存,但通常情况下它只会从返回地址的前几个字节找到分配时记录的长度信息,然后把这块内存的地址插入到相应的快查链表中。 快查链表为于进程的系统地址空间部分,用户模式的进程对其没有访问权限,只有WINDOWS本身和内核模式的驱动程序才能访问。
5