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





Вам нужен Маршал.
Редактировать: Это является для небезопасного кода, но также и sizeof ().
Marshal.SizeOf может возвращать количество байтов, отличное от используемого.
Помните, что 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#. Чтобы решить эту проблему, я разработал программа, который:
На моем компьютере (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 байта. Эти данные иллюстрируют две вещи:
Предполагая накладные расходы CLR и 4-байтовое выравнивание, я бы оценил, что объект в C# составляет 28 байтов, а LinkedListNode - 44 байта.
Кстати, у Джона Скита была идея вышеупомянутого метода раньше, чем у меня, и он заявил об этом в этот ответ, отвечая на аналогичный вопрос.
Пожалуйста, обратитесь к моему ответу по приведенной ниже ссылке.
Это возможно через расширение отладчика .sos.dll
Это не проблема, просто проявление любопытства. У меня есть куча элементов, входящих в HttpContext.Items на протяжении всего запроса, и мне было просто любопытно, сколько памяти они занимают (если это вообще имеет значение). Я прохожу этап «все измерить».