m0_54741246 2024-02-10 15:24 采纳率: 50%
浏览 8
已结题

Chunk向后合并代码size问题

代码:
size += prevsize;
p = chunk_at_offset(p, -((long) prevsize));
unlink(av, p, bck, fwd);
}

向后合并里合并后的size是怎么复值给上一个的chunk里的size

  • 写回答

13条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-10 15:24
    关注
    获得0.75元问题酬金

    引自免费微信小程序:皆我百晓生

    在C语言中,当你处理内存管理时,特别是在实现自己的内存分配器时,可能会涉及到合并相邻的空闲内存块(chunks)。下面是一个简化版的向后合并内存chunk的逻辑片段,假设size表示当前chunk的大小,prevsize是前一个chunk的大小,p指向当前chunk头部。

    // 假设chunk头部包含了size信息,并且prevsize是从前一个chunk获取的
    size_t size;
    size_t prevsize;
    struct mem_chunk *p;
    
    // 合并操作之前,先将当前chunk和前一个chunk的总大小累加到当前chunk的size中
    size += prevsize;
    
    // 移动指针p到前一个chunk的头部
    p = chunk_at_offset(p, -((long) prevsize));
    
    // 从空闲链表中删除前一个chunk,这里假设unlink函数负责这个操作
    // unlink函数通常接受参数:分配区av、待删除chunk p、以及该chunk在链表中的前后节点bck和fwd
    unlink(av, p, bck, fwd);
    
    // 在实际的内存分配器实现中,接下来一般会更新前一个chunk(现在是合并后chunk的一部分)的size字段
    // 这里假设p->prev_size是存储前一个chunk大小的字段,而p->size是当前chunk(即合并后chunk)的新大小
    p->prev_size = prevsize; // 有时不需要这一步,取决于chunk的具体布局
    
    // 更新合并后chunk的总大小(包括了原前一个chunk的大小)
    p->size = size;
    

    这段代码的核心逻辑在于合并两个连续的空闲chunk,通过移动指针p到前一个chunk的位置,并将其从空闲链表中删除。最后一步通常是更新合并后chunk的大小信息,但由于您提供的代码片段不完整,我无法展示确切的size字段更新部分。在真实的Doug Lea的malloc库或者其他内存分配器实现中,chunk结构的设计和size字段的更新方式会有一定的差异。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 创建了问题 2月10日

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错