2017-01-04 3 views
18

Есть ли разница в использовании памяти этих двух строк кода?Сколько памяти занимает int x [10]?

int *a = malloc(10 * sizeof(int)); 
int b[10]; 

В первой строке следует выделить память для 10 целых чисел и 1 указателя. Но я не уверен во втором. Будет ли это также выделять память для 10 ints и 1 указателя, или всего 10 ints?

ответ

21

Проще говоря:

int *a = malloc(10 * sizeof(int)); 

Выделяет по крайней мере sizeof(int*) байт автоматического хранения для указателя *a. Когда вызывается malloc, для вашей программы будет выделяться не менее sizeof(int) * 10 байт динамического хранилища.

С другой стороны:

int b[10]; 

Выделяет по крайней мере sizeof(int) * 10 байт автоматического хранения. Здесь нет указателей. Когда вы используете имя b в выражении (пример: a = b), оно распадается на указатель. Но a - это указатель, а b - это массив. Проверьте это на С FAQ: C-FAQ Sec. 6: arrays and pointers.

В самом обычном случае «автоматическое хранение» означает «стек», а «динамическое хранилище» означает «куча». Но это не всегда так. Вы можете прочитать несколько обсуждений по этим вопросам в этом вопросе: "Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?".

+7

Он может или не может выделять любую память в стеке для указателя '* a' в зависимости от того, как работает компилятор. Если вы используете '& a' где угодно, да, но в противном случае все ставки будут отключены. –

+0

Спасибо. Я отвечу на мой ответ. – giusti

+1

@DietrichEpp Повторное чтение, возможно, неправильно понял ваш комментарий. Не могли бы вы привести конкретный пример? – giusti

8

В первом случае a сам занимает sizeof(int *) байт автоматического хранилища, что указывает набайт динамического хранилища.

В последнем случае b занимает 10 * sizeof(int) байт автопилота. Поскольку b - это массив, указателя нет.

Таким образом, первый случай использует более общие байты, но меньше в стеке (при условии, что стек используется для автоматического хранения).

Если общее количество используемых байтов относительно невелико, автоматическое хранение обычно является прекрасным. Для больших объемов предпочтение отдается динамическому хранению. Для реализации стека, в частности, слишком большое количество слишком больших автоматических переменных может переполнять стек.

Смежные вопросы