Когда выделяется память в .NET compact framework? - PullRequest
1 голос
/ 29 октября 2008

Когда выделяется память в .NET compact framework? Если есть разница между значениями и ссылочными типами, пожалуйста, подробно. Документация или шаги для подтверждения приветствуются.

В частности, рассмотрим этот сценарий ...

private MyClass item;  // here?

public void MyMethod()
{
    item = new MyClass();  // or here?
}

Ответы [ 3 ]

5 голосов
/ 29 октября 2008

Существует 3 различных способа выделения памяти.

Статическая:

Они связаны и распределяются во время компиляции. Глобальные статические переменные, например.

Динамический стек:

Они связаны во время выполнения и помещаются в стек. Например, локальная переменная в вызове функции.

Динамическая куча:

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

Когда вы объявляете

private MyClass item;  // here?

ссылка на MyClass помещается в стек. Это только ссылка и ничего более. В этот момент его значение равно нулю.

public void MyMethod()
{
    item = new MyClass();  // or here?
}

Именно в этот момент память явно выделяется в куче, вызывая 'new MyClass ()', и затем item ссылается на нее.

Так что на самом деле у вас есть 2 переменные после вызова MyMethod. Тип ссылки именованный элемент и безымянная переменная в куче, на которую ссылается элемент, который имеет тип MyClass.

1 голос
/ 29 октября 2008

Это вопрос с подвохом, который заставляет меня нравиться намного больше, чем я думал. :)

Давайте начнем с основ:

Объявление переменной напрямую не выделяет для нее память * на ссылочных типах. Он делает так для типов значений, потому что типы значений инициализируются в точке объявления. Для ссылочных типов хранилище для объекта выделяется в точке ввода их конструкторов.

* Когда это не применимо?

  • При первом использовании данного класса (который может быть вашей первой строкой) любые статические данные уровня класса инициализируются, и если у класса есть статический конструктор (который предположительно выделяет память), он будет вызываться как Что ж. Следовательно, вы можете фактически выделить некоторую память (для статических членов) в объявлении переменной.
  • Технически, объявление переменной ссылочного типа выделяет часть памяти в стеке (как упоминал Николас Манкузо) - выделенная память является хранилищем на уровне стека для ссылки на объект. (Следует признать, что указанная ссылка - null, но как только вы инициализируете свой объект, в выделенной памяти будет действительная ссылка.)

Я настоятельно рекомендую эту статью C-Sharp Corner относительно размещения стека и кучи для получения дополнительной информации.

0 голосов
/ 30 октября 2008

Я настоятельно рекомендую вам взглянуть на MSDN Webcase на Compact Framework Memory Management . Это не совсем то же самое, что и на настольном компьютере, и в этом выступлении мы расскажем о мельчайших деталях и графике, чтобы помочь понять GC Heap.

...