c语言 malloc 源码详解,dlmalloc源码剖析之:mALLOc

这篇博客详细讲解了C语言中malloc函数的实现,特别是针对douglea malloc(即dlmalloc)的mALLOc源码分析。文章提到了malloc在不同操作系统中的实现差异,并指出在Linux环境下通常使用的是glibc中的douglea malloc或ptmalloc。主要内容围绕malloc如何在fastbin、smallbin、largebin以及unsorted bin中寻找合适的空间进行分配,包括best-fit策略和内存碎片的处理。同时,还讨论了当所有bin都无法满足需求时,如何扩展top chunk或向操作系统申请内存的过程。
摘要由CSDN通过智能技术生成

/*如果你使用linux, douglea malloc已经默认作为glibc的malloc,

新的版本可能用的是ptmalloc(dlmalloc的多线程版本)

如果你用的bsd4.2及以前系统libc用的kingsley的malloc;

BSD(包括freebsd,netbsd,openbsd)4.2以后版本libc用的是PHKmalloc;

如果你用的windows系统用的是microsoft的分配器算法;

不过其他各个系统很容易使用doug lea malloc替换现有的malloc*/

//c语言标准库提供的malloc函数;请注意malloc的几个return出口;

void* mALLOc(size_t bytes)

{

//0~4bytes->nb=16;>4bytes->nb=bytes+2个4字节头,然后对其到8bytes

checked_request2size(bytes, nb);

//如果在fastbin中有可用的块直接从fastbin中分配

if ((unsigned long)(nb) <= (unsigned long)(av->max_fast)) {

fb = &(av->fastbins[(fastbin_index(nb))]);

if ( (victim = *fb) != 0) { //静态变量成员fastbin初始化为0

*fb = victim->fd;

check_remalloced_chunk(victim, nb);

return chunk2mem(victim);

}

}

//如果是<512bytes的小块请求,从smallbin中取一块

if (in_smallbin_range(nb))

{

//根据nb大小定位到smallbin

idx = smallbin_index(nb);

bin = bin_at(av,idx);

//如果该大小的bin列表不为空

if ( (victim = last(bin)) != bin)

{

if (victim == 0) //静态变量成员smallbin初始化是0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值