Продолжение, предыдущая часть здесь
Итак, сегодня мы с Вами с помощью молотка и лопаты попытаемсясделать трепанацию черепа влезть во внутренности .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. Я сначала классифицировал их как неправильные, но позже увидел свою ошибку.
Тем не менее, оба решения основаны на том, что в классе есть открытое поле
Поэтому я решил продемонстрировать «авторский вариант»: iaroshenko.habrahabr.ru/blog/77275/#comment_2269072. Естественно, он будет работать только в этих ограниченных рамках: простейшая программа, где нет нужды создавать другие объекты или собирать мусор.
Кстати, если убрать поля совсем, то размер все равно остается тем же, только дополнительное поле равно нулю.
Итак, сегодня мы с Вами с помощью молотка и лопаты попытаемся
Имеется простейший класс: 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. Естественно, он будет работать только в этих ограниченных рамках: простейшая программа, где нет нужды создавать другие объекты или собирать мусор.
Кстати, если убрать поля совсем, то размер все равно остается тем же, только дополнительное поле равно нулю.