Прошло много времени с тех пор, как я пытаюсь выяснить правду о статических классах. моя точка зрения: типы значений выделяются в стеке, типы ссылок в куче при использовании нового оператора. но характер статического класса заключается в том, что вы не можете создать его экземпляр и, конечно, это не тип значения. поэтому у меня вопрос, когда и где CLR выделяет память для статического контента? о том, когда ... я предполагаю во время компиляции, когда сборка построена, но я не уверен. и о том, где ... пока я пытался узнать, что я читаю «CLR через C#» Дж. Рихтера, и он написал, что статический метод класса экземпляра выделяется в куче, когда вы создаете экземпляр этого конкретного class (вместе с указателем типа объекта и индексом блока синхронизации). но я не понимаю. это статично. он не должен зависеть от какого-либо состояния объекта. так что, пожалуйста, облегчите меня.Где размещаются статические классы/члены?
ответ
Как и память кучи пользователя, CLR хранит различные данные бухгалтерского учета & метаданные в куче. Это включает в себя фактический код для методов, которые вы выполняете, а также объект Type для каждого типа, загружаемого в AppDomain, - это имя, перегрузки, будь то абстрактное или запечатанное, и список всех методов (как статических, так и экземпляров), определенных на типа.
Когда вы выполняете метод, CLR просматривает информацию о методе в соответствующем объекте Type в части кучи только для CLR и выполняет этот метод. Единственное различие между экземпляром и статическими методами заключается в том, что методы экземпляра включают дополнительный «этот» указатель в аргументе метода, указывающий на экземпляр, в котором выполняется метод.
Итак, статическая информация хранится в куче вместе со всем остальным, но не связана с каким-либо конкретным экземпляром объекта.
Да, это имеет смысл! Спасибо! поэтому все эти экземпляры-статические классы выглядят обманчивыми. это просто дополнительный «этот» указатель, но все это хранится в одном и том же месте ... таким же образом. Огромное спасибо – Mark
CLR поддерживает несколько куч, связанных с AppDomain, которые в совокупности называются «кучи загрузчика». Они отличаются от собранной мусором, поскольку они не содержат коллекционируемых объектов, в основном относящихся к типу данных. Типы данных, которые существуют для жизни AppDomain.
Пространство для статических переменных выделяется в одном из них: HighFrequencyHeap. Компилятор JIT делает выделение, генерируемый им код напрямую ссылается на местоположение памяти. Фоновая информация находится в этом MSDN Magazine article.
- 1. Помощник подкаталога Makefile - управление, где размещаются объекты
- 2. PowerMock, где статические методы вызывают статические методы
- 3. Где хранятся статические переменные?
- 4. Отправка бюллетеня - не имеет значения, где размещаются изображения?
- 5. Почему шрифты не размещаются?
- 6. PHP-переменные не размещаются
- 7. Где отвязать статические обработчики событий?
- 8. Где статические данные в wpf?
- 9. Статические библиотеки Xcode: где символы?
- 10. Где статические локальные переменные go
- 11. Django - где инициализировать статические объекты?
- 12. Где CLR хранит статические классы?
- 13. Laravel где разместить статические данные
- 14. Где хранятся все статические элементы?
- 15. В Java, где хранятся примитивные статические переменные и статические функции?
- 16. Curl POST поля не размещаются
- 17. Где хранятся статические блоки CMS Magento?
- 18. Где статические конечные переменные, используемые в java?
- 19. Где хранить статические методы в ООП?
- 20. где хранить статические массивы в объекте c
- 21. Веб-приложение с Enunciate: где статические ресурсы
- 22. Где я должен объявлять статические переменные?
- 23. Где хранить статические данные в веб-приложении
- 24. Где я могу поставить статические строки?
- 25. Где на сервере хранятся статические параллельные коллекции?
- 26. Где хранятся статические переменные в java?
- 27. Где статические методы в дампе gcc.c.135r.jump
- 28. где в памяти хранятся статические переменные?
- 29. Где хранить статические данные в форме xml?
- 30. Как компилятор знает, где находятся статические поля?
Существует разница между статическими членами и конструкторами (к которым я верю, что текст, который вы цитируете, ссылается) и статические классы. Знаете ли вы об этом различии? Если да, о чем вы конкретно спрашиваете? – strager
хорошо ... разница, которую я знаю, не в распределении памяти, не так ли? здесь, я спрашиваю о распределении памяти статических классов. Я говорил о статическом методе, только из-за примера в книге Рихтера. но если есть какая-то разница между распределением статического класса и статическими членами классов экземпляров, я хотел бы это знать. – Mark
Неверно, что типы значений * всегда * выделены в стеке. –