C中的内存消耗

时间:2012-02-24 15:43:41

标签: c memory struct

我想知道如何用C来衡量图形的内存消耗。 使用以下代码,我使用V节点初始化图形,没有边缘:

Graph GRAPHinit(int V)
{ 
    int v;
    Graph G = malloc(sizeof *G);
    G->V = V; G->E = 0;
    G->adj = malloc(V*sizeof(link));
    for (v = 0; v < V; v++) G->adj[v] = NULL;

    return G;
}

Graph是一个结构,表示为邻接列表:

struct graph { 
    int V; 
    int E; 
    link *adj; 
};

typedef struct node *link; 

struct node {
    int v; 
    link next; 
};

typedef struct graph *Graph

是否可以使用sizeof-Operator测量G使用的空间量? 其他可能性?

3 个答案:

答案 0 :(得分:3)

不,你不能完全用sizeof-operator来做,因为这只能用于编译时的静态内存分配。

充其量你可以实现像

这样的新功能
unsigned int getMemoryUsage(Graph *g){ 
    return sizeof(*G) + G->V * sizeof(link);
}

答案 1 :(得分:1)

这取决于您要测量的内容:

a)此图表的内存malloc
b)由于分配图形而编程内存消耗

对于a),只计算每种节点的数量并乘以每种类型的sizeofs。对于b),您可以计算a),然后查看malloc()的实现,看看它在幕后的作用。还有其他技术,例如black box策略,往往需要付出很多努力来验证。

答案 2 :(得分:0)

G是2个整数和一个指针。 指针指向的每个结构包含一个int和另一个指针。 在32位域中,G为12个字节,每个链路为8个字节。这不计算每个malloc()所需的额外开销,也不计算malloc()实际上不必为每个结构分配如此小的内存块的事实。

简短的回答,您需要自己测量一下,或者如果您想要精确的尺寸,请从池中使用您自己的特殊分配器进行分配。