Потребление памяти в С - PullRequest
       14

Потребление памяти в С

3 голосов
/ 24 февраля 2012

Хотелось бы узнать, как измерить потребление памяти графиком в 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;
}

График представляет собой структуру, представленную в виде списка смежности:

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

typedef struct node *link; 

struct node {
    int v; 
    link next; 
};

typedef struct graph *Graph

Можно ли измерить количество пространства, которое G использует, с помощью sizeof-Operator? Другие возможности?

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Нет, вы не можете сделать это просто с помощью оператора sizeof, так как он может использоваться только для статического выделения памяти во время компиляции.

В лучшем случае вы можете реализовать новую функцию, такую ​​как

unsigned int getMemoryUsage(Graph *g){ 
    return sizeof(*G) + G->V * sizeof(link);
}
1 голос
/ 24 февраля 2012

Это зависит от того, что вы пытаетесь измерить:

а) память malloc редактируемая этим графиком
б) потребление памяти программой из-за выделения графика

для), просто посчитайте количество узлов каждого типа и умножьте их на размеры каждого типа.Для b) вы можете вычислить a), а затем посмотреть на реализацию malloc(), чтобы увидеть, что она делает за кадром.Существуют и другие методы, такие как стратегии черный ящик , которые, как правило, требуют много усилий для проверки.

0 голосов
/ 24 февраля 2012

G - 2 целых числа и указатель.Каждая структура, на которую указывает указатель, содержит int и другой указатель.На 32-битной земле 12 байтов для G и 8 байтов для каждой ссылки.Это не учитывает дополнительные издержки, которые влечет за собой каждый malloc(), а также тот факт, что malloc() фактически не должен выделять такие маленькие куски памяти для каждой структуры.

Краткий ответ, вам нужно измеритьсделайте это сами или выделите свой собственный специальный распределитель из пула, если вам нужны точные размеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...