2010-08-26 4 views
4

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

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

+1

Ссылки, поскольку они являются объектами. –

+0

Я избил тебя, Мэт;;) –

ответ

2

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

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

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

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

0

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

5

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

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

0

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

2

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

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