嵌入式裸机内存动态管理的实现与讲解(一)

  • C 的标准库自带了mallocfree,为啥还要自己实现?标准库的函数占用空间较大,采用本文的实现可节约几KB的存储空间;
  • 为啥说裸机呢?因为带系统的软件系统一般都会带内存的动态管理函数供使用;
  • 内存碎片是什么? 首先明确一点,申请内存时会返回一个首地址,从首地址往后的 size 大小的空间都可用,这就说明 malloc必须返回一段连续的内存地址;有些内存动态管理算法是不支持碎片回收的,总是以新地址开始申请。
  • 已验证,标准 C 库的mallocfree的函数不支持内存碎片回收;测试方法:循环多次申请->释放较小的内存块,然后再申请大的内存块将失败。
  • 本文说明的算法是支持内存碎片化回收的,采用把相邻的空闲内存块进行合并的方法。

算法原理

数组我们比较熟悉,定义的数组必须实现固定大小,但实际编程中,有太多的情况我们事先无法预测这个数组该定义多大;没有内存动态管理的裸机系统的做法就是定义一个尽可能大的数组,浪费了RAM,也存在数组溢出的风险。

内存的动态管理:定义一个全局的静态大数组,先占个内存的坑,别让编译器给释放或优化掉了;这就是属于用户的内存池,进行自我的内存管理;

这个大的内存池怎么管理比较好呢?本文采用单向链表的形式进行管理,如下图;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值