Сведения о вопросе

Life

14:58, 23rd August, 2020

Теги

c#   .net    

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

Просмотров: 390   Ответов: 6

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



  Сведения об ответе

+-*/

07:06, 20th August, 2020

Вам нужно Marshal.SizeOf

Edit: это для небезопасного кода, но тогда, как и sizeof().


  Сведения об ответе

SKY

13:31, 19th August, 2020

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

EDIT (я продолжал думать после публикации): потому что это немного сложнее, чем sizeof для valuetypes, например: ссылочные типы могут иметь ссылки на другие объекты и так далее... насколько мне известно, нет точного и легкого способа сделать это...


  Сведения об ответе

darknet

23:13, 27th August, 2020

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

  1. Измерьте значение программы "Working Set"
  2. Выделите много объектов.
  3. Измерьте "Working Set" еще раз.
  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 байта.

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


  Сведения об ответе

fo_I_K

03:51, 10th August, 2020

Если вы можете-Сериализуйте его!

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


  Сведения об ответе

LIZA

15:02, 11th August, 2020

Помните, что Marshal.SizeOf - это небезопасный код...

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


  Сведения об ответе

PROGA

02:14, 23rd August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться