Где 'Тип' эталонного значения хранится в памяти? - PullRequest
3 голосов
/ 10 мая 2011

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

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

спасибо!

Ответы [ 3 ]

5 голосов
/ 10 мая 2011
void M()
{
   Artist a = new Artist();
}

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

Type pointer + Sync root + Instance data

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

2 голосов
/ 10 мая 2011

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

0 голосов
/ 10 мая 2011

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

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

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

КонечноSystem.Type, будучи объектом в куче, также имеет указатель на объект типа, который указывает на информацию о его типе.Как вы, наверное, догадались - он указывает на себя, поскольку объект System.Type является объектом System.Type.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...