Формат памяти класса CLR

Какова структура памяти класса CLR?

Исходя из фона С++, макет памяти класса С++ с виртуальными функциями начинается с указателя v-таблицы, а затем элементы данных класса следуют в памяти.

У классов CLR с виртуальными функциями есть указатель v-таблицы? Является ли этот указатель первым полем в макете памяти класса? Есть ли дополнительные поля в макете памяти класса CLR в дополнение к определенным членам данных программистов? А что представляют собой эти дополнительные поля?

Ответ 1

Это конкретная реализация, но в этой статье дается описание того, что было в реализации Microsoft.NET, для CLR v2. Я подозреваю, что это так же для CLR v4, но я не мог этого гарантировать. Посмотрите раздел "ObjectInstance" для деталей, но вы можете найти целую статью интересной.

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

Ответ 2

Оригинальная статья "Jit and Run" по-прежнему находится в файле chm. Просто следуйте инструкциям MSDN, чтобы читать:

В большинстве версий окон вы должны сначала сохранить эти файлы на свой локальный компьютер, а затем разблокируйте файл, чтобы его прочитать. к разблокировать файл, щелкнуть по нему правой кнопкой мыши и выбрать свойства, а затем выберите кнопку "разблокировать". Содержимое будет доступно для прочитать

Однако, почтенный Джон Скит догадался, что неправильно, и макет памяти объекта действительно изменился. Саша Гольдштейн дает обновленный (CLR v4) обзор макета, здесь.