Сколько памяти массив объектов в C # потребляет? - PullRequest
5 голосов
/ 26 августа 2010

Предположим, что мы ранее создали три объекта A, B, C из класса D теперь массив определяет как показано ниже: D [] arr = new D [3]; обр [0] = A; обр [1] = В; обр [2] = С;

содержит ли массив ссылки на объекты или имеет отдельную копию?

Ответы [ 5 ]

5 голосов
/ 26 августа 2010

Массив ссылочных типов содержит только ссылки.

В 32-битном приложении ссылки - это 32 бита (4 байта), а в 64-битном приложении ссылки - 64 бита (8 байтов).Таким образом, вы можете рассчитать приблизительный размер, умножив длину массива на опорный размер.(Также есть несколько дополнительных байтов для внутренних переменных для класса массива, и некоторые дополнительные байты используются для управления памятью.)

3 голосов
/ 26 августа 2010

C # различает ссылочные типы и типы значений .

A ссылочный тип объявляется с использованием слова class ,Переменные этих типов содержат ссылки, поэтому массив будет массивом ссылок на объекты.Каждая ссылка имеет размер 4 байта (в 32-битной системе) или 8 байтов (в 64-битной системе).

A тип значения объявляется с использованием слова struct.Значения этого типа копируются каждый раз, когда вы их назначаете.Массив типа значения содержит копии значений, поэтому размер массива равен размеру структуры, умноженной на количество элементов.

Обычно, когда мы говорим «объект», мы ссылаемся на экземпляры тип ссылки , поэтому ответ на ваш вопрос - «да», но помните разницу и убедитесь, что вы случайно не создали большой массив большой структуры.

2 голосов
/ 26 августа 2010

Вы можете посмотреть на память, занятую массивом, используя WinDBG + SOS (или PSSCOR2).IIRC, массив ссылочных типов представлен в памяти своей длиной, за которой следуют ссылки на его элементы, т.е. его точный размер равен PLATFORM_POINTER_SIZE * (array.Length + 1)

0 голосов
/ 26 августа 2010

Как сказал @Yves, у него есть ссылки на объекты. Массив является блоком памяти, как и в C. Таким образом, размер равен sizeof (element) * count + количество памяти, необходимое для oop.

0 голосов
/ 26 августа 2010

Массив состоит из указателей (32-битных или 64-битных), которые указывают на объекты. Объект является ссылочным типом, в сам массив копируются только типы значений.

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