写点什么

跟着卷卷龙一起学 Camera-- 内存池浅析 04

作者:卷卷龙
  • 2022 年 9 月 27 日
    广东
  • 本文字数:528 字

    阅读完需:约 2 分钟

内存池的实现



在内存池实现的环节,我们需要构建两个类,一个是 MemoryBlock 类,用于管理内存块链表,其成员变量包括内存块大小,内存块剩余大小,First 代表当前内存块可以使用的第一个序号,Next 则是当前可分配单元指向的下一个可分配单元,data 则是位置指针。一个是 MemoryPool 类,用于管理内存池,开出了 alloc 和 free 的操作接口,其成员变量包括内存池初始大小,增长大小,分配单元大小,和内存块链表。



首次生成 MemoryBlock,会 new 出来一个 MemoryBlock 类,并带参数初始化。然后找到符合条件的内存块。如果找到了,则进行分配固定大小,在 MemoryPool 的 Alloc()中,遍历 block 链表,找到 nFree 大于 0 的 block,从其上分配内存单元。然后将 nFree 减一,修改 nFirst 的值,修改可用单元的大小。如果没找到则说明原来的内存块都满了,需要再次分配。



在 MemoryPool 的 Free(pFree)函数中,根据 pFree 的值,找到它所在的内存块,然后将它的序号作为 nFirst 的值(因为它绝对是空闲的),在 pFree 的头两个字节中写入原来 nFirst 的值。然后要判断,该 block 是否全部为 free,方法是检测 nFree * nUnitSize == nSize。若是,则向系统释放内存,若不是,则将该 block 放到链表的头部,因为该 block 上一定含有空隙的内存单元,这样可以减少分配时遍历链表所消耗的时间。


发布于: 刚刚阅读数: 4
用户头像

卷卷龙

关注

还未添加个人签名 2022.07.26 加入

还未添加个人简介

评论

发布
暂无评论
跟着卷卷龙一起学Camera--内存池浅析04_ISP_卷卷龙_InfoQ写作社区