Сколько памяти выделяет int x [10]?
Есть ли разница в использовании памяти этих двух строк кода?
int *a = malloc( 10 * sizeof(int) );
int b[10];
Первая строка должна выделить память для 10 целых чисел и 1 указателя. Но я не уверен во втором. Будет ли это также выделять память для 10 ints и 1 указателя, или всего 10 ints?
Ответы
Ответ 1
Проще говоря:
int *a = malloc( 10 * sizeof(int) );
Выделяет не менее sizeof(int*)
байтов автоматического хранилища для указателя *a
. Когда вызывается malloc
, для вашей программы будет выделяться не менее sizeof(int) * 10
байт динамического хранилища.
С другой стороны:
int b[10];
Выделяет не менее sizeof(int) * 10
байтов автоматического хранилища. Здесь нет указателей. Когда вы используете имя b
в выражении (пример: a = b
), оно распадается на указатель. Но a
- это указатель, а b
- массив. Проверьте это на C FAQ: C-FAQ Раздел. 6: массивы и указатели.
В самом обычном случае "автоматическое хранение" означает "стек", а "динамическое хранилище" означает "куча". Но это не всегда так. Вы можете прочитать несколько обсуждений по этим вопросам в этом вопросе: "Почему термины" автоматический "и" динамический "предпочтительнее терминов" стек "и" куча "в Управление памятью на C++?" .
Ответ 2
В первом случае a
сам занимает sizeof(int *)
байты автоматического хранилища и указывает на 10 * sizeof(int)
байты динамического хранилища.
В последнем случае b
занимает 10 * sizeof(int)
байты автоматического хранилища. Поскольку b
- это массив, указатель отсутствует.
Таким образом, первый случай использует более общие байты, но меньше в стеке (при условии, что стек используется для автоматического хранения).
Если общее количество используемых байтов относительно невелико, автоматическое хранилище обычно отлично. Для больших объемов предпочтение отдается динамическому хранению. Для реализации стека, в частности, слишком большое количество слишком больших автоматических переменных может переполнять стек.