Сколько памяти выделяется для каждого элемента при измерении массива? - PullRequest
2 голосов
/ 07 мая 2009

Например, в VB.NET:

  Dim strArray(5) As String

Насколько я понимаю, поскольку это массив, компьютер будет выделять смежные области памяти для каждого из 5 элементов. Но сколько места выделено для каждого из пяти элементов? Что если я решу поместить блок текста размером 5 МБ в позицию 2 массива?

Отличается ли он для типов значений (например, массив Int32)? Я бы подумал, что если бы пришлось изменить размер блока памяти для отдельного элемента, ему пришлось бы создать целый новый массив для сохранения непрерывной функции памяти.

Ответы [ 2 ]

4 голосов
/ 07 мая 2009

Если вы создаете массив ссылочного типа, я думаю, что только ссылки сохраняются в переменной. То есть:

Dim strArray(5) As String

На самом деле будет только 6 ссылок больших с чем-то вроде 4 байтов на ссылку (не уверен в этом).

Фактические данные будут храниться (возможно) в куче.

Это не означает, что изменение длины строки тривиально, однако - они все равно должны перераспределяться при каждом изменении.

3 голосов
/ 07 мая 2009

В .NET:

  • Массивы обычно хранятся в куче (если вы не используете что-то вроде stackalloc в C #)
  • Если вы создаете массив значений ссылочного типа (например, строки), массив только содержит ссылки
  • Ссылка составляет 4 байта при запуске 32-битного CLR и 8 байтов при запуске 64-битного CLR
  • Хотя сам массив является непрерывным в памяти, нечего сказать, что сами строки будут смежными

Так что в вашем случае сам объект массива будет

normal object overhead 
+ 4 bytes for the length (IIRC) 
+ (4 or 8 bytes per element) * 6 elements

Ссылки в массиве могут ссылаться на любую строку в любом месте памяти или Nothing.

Для типов значений массив хранит значение напрямую - поэтому массив Int32 s займет:

normal object overhead
+ 4 bytes for the length
+ 4 bytes per element

Массив Int64 s займет:

normal object overhead
+ 4 bytes for the length
+ 8 bytes per element

(и т.д.). Логические значения занимают байт на элемент, несмотря на то, что логически это всего один бит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...