Sizeof () эквивалент для ссылочных типов?

Я ищу способ получить размер экземпляра ссылочного типа. sizeof предназначен только для типов значений. Это возможно?

Это не проблема, просто проявление любопытства. У меня есть куча элементов, входящих в HttpContext.Items на протяжении всего запроса, и мне было просто любопытно, сколько памяти они занимают (если это вообще имеет значение). Я прохожу этап «все измерить».

John Sheehan 25.08.2008 22:28

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

Marek 14.09.2010 11:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
2
10 935
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вам нужен Маршал.

Редактировать: Это является для небезопасного кода, но также и sizeof ().

Marshal.SizeOf может возвращать количество байтов, отличное от используемого.

Thomas Bratt 04.05.2009 00:16

Помните, что Marshal.SizeOf предназначен для небезопасного кода ...

Я не думаю, что это возможно для управляемого кода, возможно, вы объясните свою проблему, может быть другой способ ее решения

Ответ принят как подходящий

Если вы не против, чтобы он был немного менее точным, чем идеальный, и для сравнительных целей вы можете сериализовать объект / ы и измерить его (например, в байтах)

ИЗМЕНИТЬ (я продолжал думать после публикации): Потому что это немного сложнее, чем sizeof для типов значений, например: ссылочные типы могут иметь ссылки на другие объекты и так далее ... я не знаю точного и простого способа сделать это ...

Если можете - сериализуйте это!

Dim myObjectSize As Long

Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position

Недавно у меня был аналогичный вопрос, и я хотел узнать размер Object и LinkedListNode в C#. Чтобы решить эту проблему, я разработал программа, который:

  1. Измерьте "Рабочий набор" программы
  2. Разместите много предметов.
  3. Снова измерьте «Рабочий набор».
  4. Разделите разницу на количество выделенных объектов.

На моем компьютере (64-битном) я получил следующие данные:

Measuring Object:
iter    working set     size estimate
-1      11190272
1000000 85995520        74.805248
2000000 159186944       73.998336
3000000 231473152       73.4276266666667
4000000 306401280       73.802752
5000000 379092992       73.580544
6000000 451387392       73.3661866666667
7000000 524378112       73.3125485714286
8000000 600096768       73.613312
9000000 676405248       73.9127751111111
Average size: 73.7577032239859
Measuring LinkedListNode<Object>:
iter    working set     size estimate
-1      34168832
1000000 147959808       113.790976
2000000 268963840       117.397504
3000000 387796992       117.876053333333
4000000 507973632       118.4512
5000000 628379648       118.8421632
6000000 748834816       119.110997333333
7000000 869265408       119.299510857143
8000000 993509376       119.917568
9000000 1114038272      119.985493333333
Average size: 118.296829561905
Estimated Object size: 29.218576886067
Estimated LinkedListNode<reference type> size: 44.5391263379189

Исходя из данных, средний размер выделения миллионов объектов составляет примерно 29,2 байта. Размер объекта LinkedListNode составляет примерно 44,5 байта. Эти данные иллюстрируют две вещи:

  1. Очень маловероятно, что система выделяет неполный байт. Дробная мера байтов указывает на накладные расходы, которые требуются CLR для выделения и отслеживания миллионов ссылочных типов.
  2. Если мы просто округлим количество байтов в меньшую сторону, у нас все еще вряд ли будет правильное количество байтов для ссылочных типов. Это ясно из меры Объектов. Если мы округляем в меньшую сторону, мы предполагаем, что размер равен 29 байтам, что, хотя теоретически возможно, маловероятно из-за заполнения. Для повышения производительности выделения объектов обычно дополняются в целях выравнивания. Я предполагаю, что объекты CLR будут выровнены по 4 байта.

Предполагая накладные расходы CLR и 4-байтовое выравнивание, я бы оценил, что объект в C# составляет 28 байтов, а LinkedListNode - 44 байта.

Кстати, у Джона Скита была идея вышеупомянутого метода раньше, чем у меня, и он заявил об этом в этот ответ, отвечая на аналогичный вопрос.

Пожалуйста, обратитесь к моему ответу по приведенной ниже ссылке.

Это возможно через расширение отладчика .sos.dll

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

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