当前位置: 首页 > article >正文

定长内存池设计

一、模型搭建

由于每次都是申请固定大小的内存,所以特点:性能达到极致,不考虑内存碎片

还有一个 size_t _remain 记录大空间的剩余字节,如果不够了要及时向系统申请资源。

二、开辟空间 T* New()

1、实现思路

如果自由链表里面有内存块,就优先使用自由链表里面的内存(头删即可)

如果自由链表里面没有内存块再去大空间里面申请内存。如果剩余空间不够就向操作系统申请内存。

注意我们至少要存储4/8字节的下一个内存块地址,所以如果申请的类型 T 大小不足4/8就要开成4/8字节大小。

最后定位 new,显示调用构造函数并返回 obj

2、主要操作

(1)如何获取一个地址大小的内存? 

我们知道在 32 位和 64 位下地址大小分别是 4 和 8,所以办法就是把内存强转成 *(void**),二级指针解引用后是一级指针,这样就自动判断了指针的大小

(2)如何头删自由链表?

先存自由链表的下一个内存的地址:void* next = *(void**)_freeList;

再获取固定大小的内存块:T* obj = (T*)_freeList;

最后头指针指向存放的下一个内存地址:_freeList = next;

(3)如何向操作系统申请空间?

可以用 windows 专用的函数 VirtualAlloc

参数介绍:

具体使用:

(4)如何使用定位 new?

new(obj)T;

三、释放空间 void Delete(T* obj)

1、实现思路

显示调用析构函数清空内存数据。

头插链入自由链表。

2、主要操作

如何头插自由链表?

先在 obj 中保存下一个内存块地址:*(void**)obj = _freeList;

obj 作为链表头部:_freeList = obj;

四、对比 malloc 效率

1、Debug下

2、Release下

五、代码展示

1、定长内存池

2、测试代码


http://www.kler.cn/a/386933.html

相关文章:

  • JS 实现SSE通讯和了解SSE通讯
  • HTML之表单学习记录
  • K8s进阶使用
  • ML 系列: 第 24 节 — 离散概率分布(泊松分布)
  • stringUtils详细解释
  • 如何提高自动驾驶中惯性和卫星组合导航pbox的精度?
  • 模型训练中GPU利用率低?
  • 在openwrt上跑golang程序
  • 缓存淘汰策略:Redis中的内存管理艺术
  • 前端-懒加载
  • 提瓦特幸存者4
  • Linux - 信号
  • Android GPU纹理数据拷贝
  • 谐振式DCDC设计与参数计算 - 笔记汇聚
  • 云轴科技ZStack助力新远科技开启化工行业智能制造新篇章
  • Spring Boot框架下的注解(完整版)
  • fpga开发原理图设计仿真分析
  • Kafka生产者如何提高吞吐量?
  • 使用 Redux 在 Flutter鸿蒙next 中实现状态管理
  • Excel:vba实现正则匹配
  • 【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本
  • MQTT协议解析 : 物联网领域的最佳选择
  • 浏览器是如何渲染页面的? - 2024最新版前端秋招面试短期突击面试题
  • Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法
  • 【Webpack配置全解析】打造你的专属构建流程️(1-4)
  • DBeaver工具连接Hive