- C 的标准库自带了
malloc
和free
,为啥还要自己实现?标准库的函数占用空间较大,采用本文的实现可节约几KB的存储空间;- 为啥说裸机呢?因为带系统的软件系统一般都会带内存的动态管理函数供使用;
- 内存碎片是什么? 首先明确一点,申请内存时会返回一个首地址,从首地址往后的 size 大小的空间都可用,这就说明 malloc必须返回一段连续的内存地址;有些内存动态管理算法是不支持碎片回收的,总是以新地址开始申请。
- 已验证,标准 C 库的
malloc
和free
的函数不支持内存碎片回收;测试方法:循环多次申请->释放较小的内存块,然后再申请大的内存块将失败。- 本文说明的算法是支持内存碎片化回收的,采用把相邻的空闲内存块进行合并的方法。
算法原理
数组我们比较熟悉,定义的数组必须实现固定大小,但实际编程中,有太多的情况我们事先无法预测这个数组该定义多大;没有内存动态管理的裸机系统的做法就是定义一个尽可能大的数组,浪费了RAM,也存在数组溢出的风险。
内存的动态管理:定义一个全局的静态大数组,先占个内存的坑,别让编译器给释放或优化掉了;这就是属于用户的内存池,进行自我的内存管理;
这个大的内存池怎么管理比较好呢?本文采用单向链表的形式进行管理,如下图;