структура размещения объектов в .NET с использованием дизассемблера - PullRequest
4 голосов
/ 22 марта 2011

Мне интересно увидеть структуру размещения объектов, и я пытаюсь использовать разборку в Visual Studio.Вот мой код:

class myclass
{
  public int m_a;
}

myclass myc = new myclass();
myc.m_a = 23;
//I am setting a breakpoint after this line

Я открыл окно Memory1 и набрал myc в поле Адрес.Я получаю следующие данные в окне вывода (используется Windows XP PC 32bit с компилятором Intel):

    0x0148B7BC  1c 93 a7 00 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Кажется, что есть дополнительный указатель 00a7931c, который добавляется перед данными объекта, что увеличиваетразмер объекта на 4 байта.Я путаюсь с тем, что документация говорит, что размер объекта увеличивается на 8 байт из-за заголовка на объект.Может кто-нибудь указать мне, где находятся остальные 4 байта?

Ответы [ 2 ]

8 голосов
/ 22 марта 2011

С Расширенная отладка .Net - внутренняя структура объекта CLR :

Внутренняя структура объекта CLR:

[DWORD: SyncBlock] [DWORD: указатель MethodTable] [DWORD: указатель типа ссылки]… [Поле значения типа значения]…

Заголовок объекта: [DWORD: SyncBlock]
Указатель объекта: [DWORD: указатель MethodTable] [DWORD: указатель типа ссылки]… [Поле значения типа значения]…

Каждому объекту предшествует ObjHeader ( с отрицательным смещением ). ObjHeader имеет индекс для SyncBlock.

1 голос
/ 22 марта 2011

Посмотрите на 0x0148B7B8.Структура объектов:

SyncBlock (размер ptr) MethodTable (размер ptr) Поля ...

Ссылочные точки на таблицу методов, позволяющие ускорить разыменование (учитывают относительную частотувызовы виртуальных методов и свойств против блокировки).

...