易百教程

62、什么是动态内存碎片?

内存管理功能保证如果内存被分配,那么它将适当地与任何具有基本对齐的对象对齐。基本对齐小于或等于没有对齐规范的实现所支持的最大对齐。
动态内存分配的主要问题之一是碎片,基本上,碎片发生在用户没有有效使用内存时。有两种类型的碎片,外部碎片和内部碎片。
外部碎片是由于空闲列表上可用但程序无法使用的小空闲内存块(小内存洞)造成的。有不同类型的空闲列表分配算法可以有效地使用空闲内存块。
为了理解外部碎片,考虑一个程序有 3 个连续的内存块并且用户释放中间的内存块的场景。在这种情况下,如果所需的内存块大于单个内存块(但小于或等于内存块的总和),将不会获得内存。
动态内存碎片

内部碎片浪费了为四舍五入分配的内存而分配的内存,在簿记(基础设施)中,簿记用于保存已分配内存的信息。每当我们调用 malloc 函数时,它都会保留一些额外的字节(取决于实现和系统)用于簿记。 这个额外的字节是为每次调用 malloc 保留的,并成为内部碎片的原因。

例如
参见下面的代码,程序员可能认为系统将分配 8 *100 (800) 字节的内存,但由于簿记(如果 8 字节)系统将分配 8*100 额外的字节。 这是一个内部碎片,其中 50% 的堆浪费。

//Only sample code.
#include <stdio.h>
#include <stdlib.h>
char *acBuffer[100];
int main()
{
    int iLoop = 0;
    while(iLoop < 100)
    {
        acBuffer[iLoop ] =  malloc(8);
        ++iLoop;
    }
}