2014-11-21 8 views
4

Это основной вопрос, но я не смог найти окончательного ответа. Надеюсь, кто-то может пролить свет.Площадь памяти, занимаемая массивом

Я хочу знать, сколько пространства памяти занимает один массив.

Многочисленные массивы разных типов, но с тем же объединенным размером байта занимают одинаковый объем памяти?

Является ли массив занимающим то же пространство памяти, что и несколько массивов с одинаковым размером?

Некоторые примеры:

(на моей системе 8051 микроконтроллер, char = 1 byte; int = 2 bytes ; float = 4 bytes;)

//case 1 
char array_nr1[40]; 

//case 2 
char array_nr1[10]; 
char array_nr2[10]; 
char array_nr3[10]; 
char array_nr4[10]; 

//case 3 
int array_nr1[10]; 
int array_nr2[10]; 

//case 4 
float array_nr1[10]; 

//case 5 
char array_nr1[10]; 
int array_nr2[5]; 
float array_nr3[5]; 

Все ли 5 ​​случаев принимать один и тот же объем памяти (40 байт)? Есть ли другие данные, которые хранятся в памяти (например, базовый адрес массива)

Спасибо.

+5

Без каких-либо 'padding',' optim' и 'packing', теоретически, да. –

+0

Что значит «случай» «взять память»? Для каждого объекта требуется память, если у него есть память, но требуется ли какая-либо память для этого, зависит от того, что вы делаете. Если объект никогда не упоминается, компилятор может выбрать не выделять для него какое-либо хранилище. Единственная разумная вещь, о которой вы можете спросить, это * размер * каждого объекта. –

+0

Вы уверены, что правильно исчисляете? int обычно занимает 4 байта пространства, поэтому два массива из каждых 10 int будут принимать 80 байт, а не 40 –

ответ

4

Память, занимаемая массивом, может быть получена с помощью оператора sizeof. Например

char array_nr1[40]; 

printf("%zu\n", sizeof(array_nr1)); 

Выходной сигнал будет 40, потому что sizeof(char), что размер элемента массива гарантированно будет равна 1

Вы могли бы написать тот же, например, для массива

int array_nr1[10]; 

Но было бы лучше рассчитать размер массива, умножив sizeof его элемента на числовое число элементов.

Так эта запись

sizeof(array_nr1) 

эквивалентно

10 * sizeof(int) 

Таким образом, вопрос, что размер объекта типа межд? Это зависит от реализации. Например sizeof (int) может быть равно 2 или 4 или другому значению.

Так что в вашем случае, если sizeof(int) равно 2, то эти два массива

int array_nr1[10]; 
int array_nr2[10]; 

занимают 2 * (10 * sizeof(int)) => 40 байт. Это тот же объем памяти, занимаемый массив

char array_nr1[40]; 

Если sizeof(int) равно 4, то массивы занимают разные объемы памяти.

Те же наблюдения действительны для массивов типа float. Обычно размер в байтах объекта типа float равен 4.Таким образом, если sizeof(int) равно 2, то эти массивы

char array_nr1[10]; 
int array_nr2[5]; 
float array_nr3[5]; 

occuoy такое же количество памяти как массив

char array_nr1[40]; 

, потому что

10 * SizeOf (Char) + 5 * SizeOf (INT) + 5 * sizeof (float) => 10 * 1 + 5 * 2 + 5 * 4 => 40 байт.

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