【问题标题】:Memory consumption in CC中的内存消耗
【发布时间】:2012-03-15 01:40:25
【问题描述】:

我想知道如何在 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 使用的空间量? 其他可能性?

【问题讨论】:

  • 这段代码真的可以编译吗?
  • @Lefteris 不,它没有。
  • 我认为它缺少typedef struct graph *Graph。 @PaulP.R.O.是的,你可以,而且它非常很有用。 sizeof 是一个编译时构造(忽略 VLA),它简单地评估为 G 指向的类型的大小。
  • @delnan 很酷,现在很好。谢谢

标签: c memory struct


【解决方案1】:

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

您最多可以实现一个新功能,例如

unsigned int getMemoryUsage(Graph *g){ 
    return sizeof(*G) + G->V * sizeof(link);
}

【讨论】:

    【解决方案2】:

    G 是 2 个整数和一个指针。 指针指向的每个结构都包含一个int 和另一个指针。 在 32 位域中,G 为 12 个字节,每个链接为 8 个字节。这还不包括每个 malloc() 带来的额外开销,也没有计算 malloc() 实际上不必为每个结构分配这么小的内存块。

    简短的回答,如果您想要确切的大小,您需要自己测量或使用您自己的特殊分配器从池中分配。

    【讨论】:

      【解决方案3】:

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

      a) 内存 malloced by this graph
      b) 由于分配图而导致的程序内存消耗

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

      【讨论】:

        猜你喜欢
        • 2016-08-30
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-18
        • 2015-07-04
        相关资源
        最近更新 更多