malloc存储其元数据

时间:2014-06-23 05:48:30

标签: c malloc details

令人惊讶的是,即使数据类型不同,两个程序的两个指针之间的区别也相同......

malloc如何存储其元数据正是我试图通过这个小实验找到的......

计划1:

int main ()
{
    char *i,*j;

    i=(char*)malloc (sizeof(char));
    j=(char*)malloc (sizeof(char));

    printf ("%x\n",i);

    printf ("%x\n",j);
return 0;
}

输出:

710010
710030

计划2:

int main ()
{
    int *i,*j;

    i=(int*)malloc (sizeof(int));
    j=(int*)malloc (sizeof(int));

    printf ("%x\n",i);

    printf ("%x\n",j);
return 0;
}

输出:

16b8010
16b8030

在此计划之前我的想法:

| meta data of i | memory space of i | meta data of j | memory space of j |

但结果不支持理论......

3 个答案:

答案 0 :(得分:4)

malloc将“分配”舍入到编译时为库设置的方便大小。这导致后续分配和释放分段内存的次数少于创建分配以完全匹配请求的时间。

其中malloc存储其元数据实际上并不是为什么两者的值都是0x20“相隔”的原因。但是,您可以阅读一种实施malloc(和朋友)here的方法;特别参见幻灯片16和28。

想象一下字符串操作程序的情况,其中许多不同大小的分配以“随机”顺序发生。微小的“遗留”块将很快发展,在所使用的块之间留下完全无用的内存字节。 malloc通过满足一些最小大小的倍数(在这种情况下显然是0x20)来满足所有内存请求来防止这种情况。 (好的,从技术上讲,你请求0x1E字节,在你的请求之后会留下2个字节的“浪费”空间并且未使用。因为malloc分配0x20字节而不是0x1E,但是不会有2-剩下的字节片段。这真的很好,因为malloc的元数据肯定大于2字节,所以甚至无法跟踪这些字节。)

答案 1 :(得分:1)

malloc会根据需要从操作系统请求空间,而不是从已编译的固定大小的数组中进行分配。由于程序中的其他活动也可以在不调用此分配器的情况下请求空间,因此malloc管理的空间可能不是连续的。因此,其空闲存储将保留为空闲块列表。每个块包含一个大小,指向下一个块的指针以及空间本身。这些块按照存储地址增加的顺序保留,最后一个块(最高地址)指向第一个。

storage allocation

发出请求后,将扫描空闲列表,直到找到足够大的块为止。与first fit相比,该算法称为best fit,该算法寻找将满足请求的最小块。如果块恰好是所请求的大小,则将其从列表中取消链接并返回给用户。如果块太大,则将其拆分,并在剩余量保留在空闲列表上的同时将适当的量返回给用户。如果未找到足够大的块,则操作系统将获取另一个大块并将其链接到空闲列表中。

答案 2 :(得分:0)

malloc通常使用一个内存池,“元数据”保存在池中而不是“在”分配的内存块之间。