malloclab的一些思路

首先是参考书上第598-602页代码,但是照搬书上的代码只有六十多分(默认的也有七十多)。

注意到书上P594页说,下一次适配很可能比首次适配内存利用率高,尤其是当链表前面布满了许多小碎片的时候,但在有些情况下,下一次适配不及首次适配,书上的代码采用的是首次适配,因此尝试下一次适配。

两者最大的差别就在于find_fit函数,首先给出书上的首次适配函数:

//首次适配,书本P619答案
static void *find_fit(size_t size)
{
   	void *bp;
   	for(bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)){
   		if(!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp)))){
   			return bp;
   		}
   	}
    return NULL;    
}

为了实现下一次适配,我们要多定义一个全局变量:

static char *pre_listp;

这个全局变量的更新规则是:首先mm_init时候要更新,然后place的时候要更新,这两个是必须的,也是下一次适配的要求,此外当free的时候也更新这个值效果好一些。

这样就可以重写find_fit函数了:


//下一次适配
static void *find_fit(size_t asize)
{
    char *bp = pre_listp; 
    size_t alloc;	//这个块是否分配了
    size_t size;	//这个块多大
    while (GET_SIZE(HDRP(NEXT_BLKP(bp))) > 0) {
        bp = NEXT_BLKP(bp);
        alloc = GET_ALLOC(HDRP(bp));
        if (alloc) continue; //分配了继续找
        size = GET_SIZE(HDRP(bp));
        if (size < asize) continue; //没分配看大小
        return bp;
    } 
    bp = heap_listp; //如果后面没找到,可能在前面
    while (bp != pre_listp) {
        bp = NEXT_BLKP(bp);
        alloc = GET_ALLOC(HDRP(bp));
        if (alloc) continue;
        size = GET_SIZE(HDRP(bp));
        if (size < asize) continue;
        return bp;
    } 
    return NULL;
}

这样测试出来能有80多分,当然,最佳适配理论上比前两者都好,但事实上只有七十多分,还不如下一次适配,不知道什么原因,有没有大佬告诉一下。

static void *find_fit(size_t asize)
{
    void *bp;
    void *ans;
    int flag = 0;
    size_t size = CHUNKSIZE;
   	for(bp = heap_listp; GET_SIZE(HDRP(bp)) > 0; bp = NEXT_BLKP(bp)){
   		if(!GET_ALLOC(HDRP(bp)) && (asize <= GET_SIZE(HDRP(bp))) && (GET_SIZE(HDRP(bp)) < size)){
            flag = 1;
            size = GET_SIZE(HDRP(bp));
   			ans = bp;
   		}
   	}
    if(flag) return ans;
    return NULL;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值