2010-08-01 3 views
3

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

+1

Существует разница между статическими членами и конструкторами (к которым я верю, что текст, который вы цитируете, ссылается) и статические классы. Знаете ли вы об этом различии? Если да, о чем вы конкретно спрашиваете? – strager

+0

хорошо ... разница, которую я знаю, не в распределении памяти, не так ли? здесь, я спрашиваю о распределении памяти статических классов. Я говорил о статическом методе, только из-за примера в книге Рихтера. но если есть какая-то разница между распределением статического класса и статическими членами классов экземпляров, я хотел бы это знать. – Mark

+1

Неверно, что типы значений * всегда * выделены в стеке. –

ответ

1

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

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

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

+0

Да, это имеет смысл! Спасибо! поэтому все эти экземпляры-статические классы выглядят обманчивыми. это просто дополнительный «этот» указатель, но все это хранится в одном и том же месте ... таким же образом. Огромное спасибо – Mark

4

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

Пространство для статических переменных выделяется в одном из них: HighFrequencyHeap. Компилятор JIT делает выделение, генерируемый им код напрямую ссылается на местоположение памяти. Фоновая информация находится в этом MSDN Magazine article.

Смежные вопросы