Вопрос

Я на 64 -битной платформе, поэтому все ADR памяти - 8 байтов.

Таким образом, чтобы получить оценку использования памяти массива, если я добавлю 8 байтов к размеру (дататип) для каждой записи в массиве.

Пример:

short unsigned int *ary = new short unsigned int[1000000]; //length 1mio
//sizeof(short unsinged int) = 2bytes 
//sizeof(short unsinged int*) = 8 bytes

Так занимает ли каждая запись 10bytes? И поэтому мой массив длины 1mio будет использовать как минимум 10 мегабайт?

Благодарность

Это было полезно?

Решение

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

Например, если переменная a известный в память 0xffff0012 установлен на 0x76543210, тогда они могут быть выложены в памяти как:

            +-------------+ This is on the stack or global.
0xffff0012  |  0x76543210 |
            +-------------+

            +-------------+ This is on the heap (and may also
0x76543210  |  a[     0]  |   have some housekeeping information).
            +-------------+
0x76543212  |  a[     1]  |
            +-------------+
0x76543214  |  a[     2]  |
            +-------------+
0x76543216  |  a[     3]  |
            +-------------+
               :       :
            +-------------+
0x7672B68E  |  a[999999]  |
            +-------------+

И вы можете видеть, что адрес индекса n является 0x76543210 + n * 2.

Таким образом, у вас на самом деле будет один 8-байтовый указатель и миллион 2-байтовых шорт, которые в вашем случае составляют 2000,008 байтов.

Это на вершине любого malloc Накладные расходы на дом, которые, как и сам указатель, незначительно по сравнению с вашим фактическим массивом.

Другие советы

Нет, здесь есть только один указатель, а не указатель на запись. Ваша оценка размера 1000000*2 + 8.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top