我如何预先计算calloc将分配多少内存?

时间:2012-01-24 01:29:28

标签: c calloc

我基本上都有这段代码。

char (* text)[1][80];
text = calloc(2821522,80);

我计算它的方式,那个calloc应该已经分配了215.265045兆字节的RAM,但是,程序最终超过了这个数字并分配了近700mb的内存。

所以看来我无法正确知道该功能将分配多少内存。

如何计算这个属性?

2 个答案:

答案 0 :(得分:5)

calloc(和malloc就此而言)可以自由分配满足请求所需的空间。

所以,不,你不能事先告诉实际给你多少钱,你只能假设它给你你所要求的金额。

话虽如此,700M看起来有点过分,所以我会调查calloc是否完全由此负责,例如,执行{{1}的程序1}}仅此而已。

您可能还想调查一下测量内存使用情况的方式。

例如,以下程序:

calloc

输出,在我的系统上:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

int main (void) {
    char (* text)[1][80];
    struct mallinfo mi;

    mi = mallinfo(); printf ("%d\n", mi.uordblks);
    text = calloc(2821522,80);
    mi = mallinfo(); printf ("%d\n", mi.uordblks);

    return 0;
}

意味着66144 225903256 已分配calloc字节,这只是请求225,837,112之上的一个smidgeon(115,352字节或0.05%)。

答案 1 :(得分:0)

这取决于malloc / calloc的底层实现。

它通常像这样工作 - 这个叫做堆指针的东西指向堆的顶部 - 动态内存分配的区域。当首次分配内存时,malloc在内部从内核请求x量的内存 - 即堆指针增加一定量以使该空间可用。 x可能会或可能不会等于您请求的内存块的大小(考虑到将来的malloc可能会更大)。如果不是,那么您至少会获得所请求的内存量(有时因为对齐问题而给予更多内存)。其余部分是由malloc维护的内部免费列表的一部分。总结一下,malloc有一些基础数据结构,很大程度上取决于它们的实现方式。

我的猜测是x的内存量(无论出于何种原因)比你要求的要大,因此malloc / calloc在其空闲列表中保留了其余部分。尝试分配更多内存,看看脚印是否增加。