Узнайте размер объекта .NET

53
задан Parth Jani 24 February 2014 в 01:31
поделиться

3 ответа

Не забывайте, что размер фактического объекта не включает размер никаких объектов, на которые это ссылается.

единственными вещами, которые, вероятно, закончатся на "куче" для больших объектов, являются массивы и строки - другие объекты имеют тенденцию быть относительно маленькими в себе. Даже объект с (говорит), что 10 переменных ссылочного типа (4 байта каждый на x86) и 10 GUID (16 байтов каждый) только собираются поднять приблизительно 208 байтов (существует немного служебное для типа ссылочный и синхронизирующий блок).

Аналогично при размышлении о размере массива, не забывайте что, если тип элемента является ссылочным типом, то это - только размер эти ссылки , которые значат сам массив. Другими словами, даже если у Вас будет массив с 20 000 элементов, размер самого объекта массива только будет только по 80K (на x86), даже если это сошлется на намного большее количество данных.

52
ответ дан Jon Skeet 7 November 2019 в 08:32
поделиться

Вы входите в область усовершенствованной отладки.NET. Запустите с John Robins, отлаживающий книги .

Использование WinDBG с Sos.dll (часть распределения.NET) и Sosex.dll расширения. С этими инструментами можно действительно видеть то, что происходит, когда приложение работает. Вы найдете ответы на свои вышеупомянутые вопросы.

(Другая рекомендация состояла бы в том, чтобы установить Общий источник CLI 2.0 , иначе. Ротор 2, для наблюдения, что продолжается под капотом.)

9
ответ дан David Pokluda 7 November 2019 в 08:32
поделиться

Если это не огромный valuetype или тип экземпляра (т.е. много тысяч полей), единственные типы, о которых необходимо волноваться, являются большими массивами или строками. Конечно, для выяснения размера массива необходимо знать размер элемента.

.NET (в настоящее время) выравнивает типы почти таким же способом, которым собственные компиляторы выравнивают типы. Фундаментальные типы имеют естественное выравнивание, которое обычно является окруженным интегральным питанием двух самых близких к их размеру:

Single, Int32, UInt32 - 4
IntPtr, UIntPtr, pointers, references  - 4 on 32-bit, 8 on 64-bit
Double, Int64, UInt64 - 8
Char, Int16, UInt16   - 2
Byte, SByte           - 1

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

сами Пользовательские типы имеют выравнивание, которое вычисляется как самое высокое выравнивание любого из их типов поля. Размер типа расширяется при необходимости для создания размера типа выровненным также.

, Но конечно, всеми ссылочными типами является все еще только IntPtr. Размер в размере и выравнивании, таким образом, размер ссылочного типа не будет влиять на массивы того типа.

Примечание, которое CLR может выбрать, по его усмотрению, к типам макета по-другому, чем описанный выше, возможно, чтобы увеличить местность кэша или уменьшить дополнение, требуемое выравниванием.

4
ответ дан Barry Kelly 7 November 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: