Вы не можете, в основном. Это будет зависеть от заполнения, которое вполне может основываться на используемой вами версии CLR, процессоре и т. Д. Проще определить общий размер объекта, предполагая, что он не имеет ссылок на другие объекты: создайте большой массив, используйте GC.GetTotalMemory для базовой точки, заполните массив ссылками на новые экземпляры вашего типа, а затем снова вызовите GetTotalMemory. Отнимите одно значение от другого и разделите на количество экземпляров. Возможно, вам следует заранее создать один экземпляр, чтобы убедиться, что новый код JITted не влияет на число. Да, это так же хакерски, как и звучит, - но до сих пор я использовал это с хорошим эффектом.
Буквально вчера я думал, что было бы неплохо написать для этого небольшой класс помощников. Дайте мне знать, если вам будет интересно.
РЕДАКТИРОВАТЬ: Есть два других предложения, и я хотел бы обратиться к ним обоим.
Во-первых, оператор sizeof : он показывает только то, сколько места занимает тип в аннотации, без дополнения вокруг него. (Он включает отступы внутри структуры, но не отступы, применяемые к переменной этого типа внутри другого типа.)
Далее, Marshal.SizeOf : показывает только неуправляемый размер после сортировки, а не фактический размер в памяти. В документации прямо говорится:
Возвращенный размер на самом деле
размер неуправляемого типа.
неуправляемые и управляемые размеры
объект может отличаться. Для персонажа
типы, размер зависит от
Значение CharSet, примененное к этому классу.
И снова, отступы могут иметь значение.
Просто чтобы прояснить, что я имею в виду, что отступы актуальны, рассмотрим эти два класса:
class FourBytes { byte a, b, c, d; }
class FiveBytes { byte a, b, c, d, e; }
На моем компьютере x86 экземпляр FourBytes занимает 12 байтов (включая служебные данные). Экземпляр FiveBytes занимает 16 байтов. Единственная разница - это переменная "e" - так что, это занимает 4 байта? Ну вроде ... и вроде нет. Совершенно очевидно, что вы можете удалить любую переменную из FiveBytes, чтобы уменьшить размер до 12 байт, но это не означает, что каждая переменных занимает 4 байта (подумайте об удалении всех из них! ). Стоимость одной переменной просто не является концепцией, которая имеет здесь большой смысл.