Где «Тип» ссылочного значения хранится в памяти?

#c# #.net #vb.net #memory #reference

#c# #.net #vb.net #память #ссылка

Вопрос:

Поскольку ссылочные значения хранятся в куче в виде данных; где хранится информация о типе любого ссылочного значения?

Если существует пара экземпляров класса Artist; когда они хранятся в куче, как .Net помечает эти блоки памяти как тип исполнителя?

Спасибо!

Ответ №1:

 void M()
{
   Artist a = new Artist();
}
  

При вызове метода расширяется новый фрейм стека, в CLR есть некоторый код подготовки перед выполнением первого оператора метода, например, prolegomenon. В течение этого периода CLR загружает все типы, используемые в методе. В этом примере тип Artist будет загружен в кучу. Но также возможно, что тип уже существует, потому что тип используется перед M() вызовом. Затем мы переходим к первому выражению, new инструкции, которая вызывает конструктор класса. Если вы взглянете на сгенерированный им CIL, вы увидите что-то вроде newobj blabla. Здесь блок памяти в куче выделяется для хранения экземпляра. Размер блока зависит от деталей класса, потому что блок должен содержать все данные экземпляра. Обычно блок состоит из:

 Type pointer   Sync root   Instance data
  

Указатель типа указывает на его тип в куче (загруженный в prolegomenon). Корень синхронизации — это запись для блокировки и синхронизации. Данные экземпляра хранят данные членов экземпляра.

Комментарии:

1. Для ссылочного типа ответ ясен. Но где хранится объект типа типа типа типа, имеет ли объект типа значения: указатель типа корень синхронизации Дополнительные поля данных экземпляра?

Ответ №2:

Среда CLR хранит пару битов информации вместе с данными в вашем экземпляре объекта. Одним из них является указатель на тип объекта.

Ответ №3:

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

Все объекты имеют указатель типа object, который указывает на объект, в котором хранится информация о классе.

Итак, например, если у вас есть объект Person, у него будет указатель типа object, который указывает на объект в куче, в котором хранится вся информация о person. Этот объект типа person также будет иметь указатель типа object, который указывает на объект System.Введите, поскольку это тип System.Тип (это объект, который хранит информацию о типе объекта).

Конечно, система.Тип, будучи объектом в куче, также имеет указатель type object, который указывает на информацию о том, к какому типу он относится. Как вы, наверное, догадались — он указывает на себя как на систему.Объект типа — это система.Тип объекта.

Когда вы вызываете GetType() для объекта, он просто возвращает адрес, сохраненный в указателе объекта определенного типа objects.