c语言的三种基本流程结构(图文并茂-深度剖析C语言中动态内存分配的幕后实现)
c语言的三种基本流程结构(图文并茂-深度剖析C语言中动态内存分配的幕后实现)本文主要介绍了动态内存分配中的基础概念,从而帮助更好的理解动态内存分配机制幕后的技术实现细节。图文并茂-深度剖析C语言中动态内存分配的幕后实现(2)malloc申请到的内存块结构示意图内部内存碎片示意图外部内存碎片示意图每个分配到的内存块需要额外的一个空间来存储其大小,如下图所示,应用程序申请4字节内存,而实际是分配了5个字节,第一个字节位置存放大小,之后4个字节提供给应用程序使用。
动态内存分配器程序员可以用动态内存分配器(malloc)在程序运行时申请内存,动态内存分配器管理着一块我们称为heap的内存区域。动态内存分配器维护着heap,就像管理着一组大小可变的内存块的集合一样,比如分配和释放(free)。
有两种分配器,一种是显示的,需要程序员去分配和释放空间,例如C语言中的malloc和free,而另一种是隐式的,程序员分配空间,但不去释放,比如Java中的垃圾收集器,这里我们将只讨论C语言中显示的内存分配和释放实现。
下图中的例子,清晰展示了C语言中分配和释放内存的一个简单过程。
C语言中分配和释放内存的例子
内存分配器的两个重要性能指标,吞吐率和内存利用率- 吞吐率,就是单位时间内能够完成的请求数量。例如,1秒钟内完成了1000次malloc和1000次free,那么吞吐率就是2000/秒;
- 内存利用率,经过n次的malloc和free后,内存利用率越高越好,但这个和吞吐率之间往往是冲突的。内存碎片会导致比较差的内存利用率。
- 内部内存碎片,数据对齐和数据大小小于分配到的块大小,及维护堆数据结构都会导致内部内存碎片。
内部内存碎片示意图
- 外部内存碎片,堆中有足够的未使用内存,但是没有一个单独连续的空闲内存块满足需要的内存大小。
外部内存碎片示意图
内存块的数据结构每个分配到的内存块需要额外的一个空间来存储其大小,如下图所示,应用程序申请4字节内存,而实际是分配了5个字节,第一个字节位置存放大小,之后4个字节提供给应用程序使用。
malloc申请到的内存块结构示意图
本文主要介绍了动态内存分配中的基础概念,从而帮助更好的理解动态内存分配机制幕后的技术实现细节。图文并茂-深度剖析C语言中动态内存分配的幕后实现(2)
图文并茂-深度剖析C语言中动态内存分配的幕后实现(3)