C语言动态内存分配

Posted HQYJ_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言动态内存分配相关的知识,希望对你有一定的参考价值。

首先要明白为何需要动态内存分配,熟悉C语言的读者应该对这个比较熟悉,需要一段内存时会使用malloc函数来申请所需要大小的内存,函数返回一段内存的首地址。简单来说,动态内存分配的好处在于需要内存的时候可以按需分配,当不需要内存的时候可以将其释放掉,这样可以高效的利用内存。下面本文从零开始实现一个完整的动态内存分配。

简单动态内存分配实现
内存分配是将没有使用的内存块给需要的变量(普通变量、指针变量、结构体变量等等)使用,由于其使用后需要进行释放,这就会导致空闲的内存是分散在内存池中的。因此,必须要对内存进行管理,也就是对内存的使用情况做标记。

上图是一个内存池使用后的某一时刻,可以看到,使用的块和没有使用的块并不是连续的,这样就需要用一个表对其进行标记,这个表称为BitMap。假设现在将内存按照每个Byte进行划分,然后用一个bit对块进行标记,1表示已使用,0表示没有使用,这样一个块需要一个bit。

下面来用C语言来实现这个简单的动态内存分配。

最终终端输出结果如下:

上面已经实现了一个简单的动态内存分配,可以完成内存的分配和释放以及输出使用率和查看位图。这种方式实现的动态内存分配不会产生内部碎片,这也是其优势所在,但其缺点很明显就是利用率太低。
实用的动态内存分配
细心的读者可能已经发现上面的简单动态内存分配有一个缺点,就是一个bit只能表示一个字节,也就是说表示8个字节就需要一个字节的位图,这种映射导致其内存的

这对于很多情况是比较浪费的。为了提高利用率,就必须将映射块的粒度增大,也就是一个Bit的映射范围对应多个字节。

上图给出了一个bit映射到64Byte,这样:

虽然利用率变高了,但是其会产生内部碎片,所谓内部碎片就是在最小粒度内无法使用的内存空间,为何这个空间无法使用了,原因在于当在申请内存块的时候,其内存只能以64B对齐的,即使小于64B,也得按64B来看作,因为这个粒度已经被bitmap标记使用了,当下次使用时,其无法被分配。因此,可以看到,粒度越大,其可能产生的内部内存碎片越大,内存利用率和碎片是需要权衡了,好的算法只能解决外部碎片问题,无法解决内部碎片问题,因此在实现动态内存分配时必须权衡考虑,以达到最优结果。

免费学习资料: 学习交流群:943552345
1小时带你入门Linux下C语言开发
http://www.makeru.com.cn/live/5413_2337.html?s=10
c代码这样调试更高效
http://www.makeru.com.cn/live/5413_2302.html?s=10
新冠病毒管理系统,如何用代码实现?
http://www.makeru.com.cn/live/5413_2269.html?s=10
一节课搞懂文件IO与标准IO
http://www.makeru.com.cn/live/5413_2293.html?s=10
给你支几招来提升自学的效率
http://www.makeru.com.cn/live/5413_2246.html?s=10
关于栈,面试官会考什么
http://www.makeru.com.cn/live/5413_2230.html?s=10
c语言中变量的存储类型
http://www.makeru.com.cn/live/5413_2153.html?s=10
入门小萌新必备:宏定义和函数的关系
http://www.makeru.com.cn/live/5413_2145.html?s=10

C语言编程基础
http://www.makeru.com.cn/live/1758_311.html?s=10
C语言(系列“点标题下的开始学习就可以看了”)
http://www.makeru.com.cn/course/details/2233?s=10
提升C编程能力
http://www.makeru.com.cn/live/1392_1166.html?s=10
夯实C语言,从小白到大牛的进阶之路!
http://www.makeru.com.cn/live/5413_1980.html?s=10
指针
http://www.makeru.com.cn/live/1392_238.html?s=10
指针换装你还认识吗
http://www.makeru.com.cn/live/5413_2043.html?s=10
C语言控制led灯
http://www.makeru.com.cn/live/1392_304.html?s=10
输入和输出
http://www.makeru.com.cn/live/1758_312.html?s=10

C语言实现面向对象编程
http://www.makeru.com.cn/live/1392_1051.html?s=10
结构体普及与应用
http://www.makeru.com.cn/live/5413_1909.html?s=10
C语言玩转链表
http://www.makeru.com.cn/live/1392_338.html?s=10
数据类型、常量、变量及运算符
http://www.makeru.com.cn/video/1877.html?s=10
C语言与数据结构的经典实战案例
http://www.makeru.com.cn/live/5413_2014.html?s=10
Linux C语言高级开发
http://www.makeru.com.cn/course/details/2478?s=10
必备Linux命令和C语言基础
http://www.makeru.com.cn/video/1862.html?s=10

以上是关于C语言动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的动态内存分配的用法举例

c语言分配内存方式都有哪些

动态内存分配(c语言)

C语言动态内存分配

C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)

C语言动态内存分配