Как заранее рассчитать, сколько памяти выделит calloc? - PullRequest
0 голосов
/ 24 января 2012

У меня в основном есть этот кусок кода.

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

Как я рассчитал, calloc должен был выделить 215,265045 мегабайт оперативной памяти, однако программа в итоге превысила это число и выделила почти 700 Мб оперативной памяти.

Похоже, я не могу точно знать, сколько памяти выделит эта функция.

Как рассчитать это свойство?

Ответы [ 2 ]

5 голосов
/ 24 января 2012

callocmalloc в этом отношении) могут свободно выделять столько места, сколько необходимо для удовлетворения запроса.

Итак, нет, вы не можете заранее сказать, сколько это будет на самом деле дать вам, вы можете только предполагать, что вам дается сумма, которую вы просили.

Сказав это, 700M кажется немного чрезмерным, поэтому я бы выяснил, был ли calloc исключительно ответственен за это, например, программой, которая only выполняет 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.

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

Ну, это зависит от базовой реализации malloc / calloc.

Обычно это работает следующим образом - есть такая вещь, называемая указателем кучи, которая указывает на вершину кучи - область, из которой выделяется динамическая память. Когда память выделяется впервые, malloc внутренне запрашивает у ядра x объем памяти - то есть указатель кучи увеличивается на определенную величину, чтобы освободить это пространство. Это x может или не может быть равным размеру запрашиваемого вами блока памяти (он может быть больше для учета будущих malloc). Если это не так, то вам предоставляется по крайней мере тот объем памяти, который вы запрашивали (иногда вы получаете больше памяти из-за проблем с выравниванием). Все остальное входит в состав внутреннего свободного списка, поддерживаемого malloc. Подводя итог, можно сказать, что malloc имеет некоторые базовые структуры данных, и многое зависит от того, как они реализованы.

Я предполагаю, что объем памяти x был больше (по любой причине), чем вы запрашивали, и, следовательно, malloc / calloc держал остальные в своем свободном списке. Попробуйте выделить больше памяти и посмотреть, увеличивается ли площадь.

...