0

我基本上有这段代码。

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

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

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

如何计算该属性?

4

2 回答 2

5

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

所以,不,你不能提前知道它实际上会给你多少,你只能假设它给了你你要求的数量。

话虽如此,700M 似乎有点过分,所以我会调查是否calloc仅由一个程序负责,例如,一个只做的程序,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字节仅比请求的高一点(115,352字节或) 。0.05%225,721,760

于 2012-01-24T01:33:58.463 回答
0

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

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

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

于 2012-01-24T03:30:41.330 回答