Pull to refresh

C#: Этюды, часть 4

Reading time1 min
Views648
Продолжение, предыдущая часть здесь

Итак, сегодня мы с Вами с помощью молотка и лопаты попытаемся сделать трепанацию черепа влезть во внутренности .NET.

Имеется простейший класс: class X { public int Val; }. При создании объекта этого класса какой реальный размер он будет занимать? И какие значения будут содержать дополнительные поля? Предъявите доказательство в виде кода на C# ;)

Разумеется, это только первая загадка из серии, но этого должно хватить по крайней мере на выходные. Выяснение внутренностей .NET — достаточно большая тема.
Примечание: поскольку речь идет о системно-зависимых вещах, я буду полагать, что код выполняется на 32-битной ОС.

UPD Итак, было получено два схожих решения: от lam0x86: iaroshenko.habrahabr.ru/blog/77275/#comment_2250121 и от crjd: iaroshenko.habrahabr.ru/blog/77275/#comment_2252317. Я сначала классифицировал их как неправильные, но позже увидел свою ошибку.

Тем не менее, оба решения основаны на том, что в классе есть открытое поле int. Если же это будет не поле, а свойство, или не будет совсем ни полей ни свойств, то такое решение не сработает.
Поэтому я решил продемонстрировать «авторский вариант»: iaroshenko.habrahabr.ru/blog/77275/#comment_2269072. Естественно, он будет работать только в этих ограниченных рамках: простейшая программа, где нет нужды создавать другие объекты или собирать мусор.

Кстати, если убрать поля совсем, то размер все равно остается тем же, только дополнительное поле равно нулю.
Tags:
Hubs:
+8
Comments41

Articles