malloc函数的原理

给出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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值