Где размещаются статические классы / члены? - PullRequest
3 голосов
/ 02 августа 2010

Давно я пытаюсь узнать правду о статических классах. моя точка зрения: типы значений размещаются в стеке, ссылочные типы в куче, при использовании оператора new. но природа статического класса заключается в том, что вы не можете создать его экземпляр, и, конечно, это не тип значения. поэтому у меня есть вопрос, когда и где CLR выделяет память для статического содержимого? о том, когда ... я предполагаю, что во время компиляции, когда сборка построена, но я не уверен. и о том, где ... в то время как я пытался выяснить, я прочитал "CLR через C #" Дж. Рихтера, и он написал, что статический метод класса экземпляра размещается в куче, когда вы создаете экземпляр этого конкретного класс (вместе с указателем объекта типа и индексом блока синхронизации). но я не понимаю это статично. это не должно зависеть от какого-либо состояния объекта. так что, пожалуйста, просветите меня.

Ответы [ 2 ]

4 голосов
/ 02 августа 2010

CLR поддерживает несколько куч, связанных с доменом приложений, которые в совокупности называются «кучами загрузчиков». Они отличаются от кучи, собираемой мусором, поскольку не содержат собираемых объектов, в основном относящихся к типу данных. Тип данных, который существует на протяжении всего жизненного цикла AppDomain.

Место для статических переменных выделено в одной из них, HighFrequencyHeap. JIT-компилятор выполняет выделение, код, который он генерирует, напрямую ссылается на область памяти. Справочная информация находится в этой статье журнала MSDN .

1 голос
/ 02 августа 2010

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

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

Таким образом, статическая информация хранится в кучесо всем остальным, но это не связано с каким-либо конкретным экземпляром объекта.

...