распределение памяти типов значений и ссылочных типов в .net framework - PullRequest
4 голосов
/ 15 июля 2009

Есть ли расширенная статья, которую я могу прочитать, которая может объяснить, как выделяется память для различных типов (значение и ссылка) в .net framework.

например, мы знаем, что типам значений выделяется место в стеке, но как это можно сделать?

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

Ответы [ 5 ]

10 голосов
/ 15 июля 2009

Это сложнее, чем вы думаете. Даже ваше утверждение о том, что «типы значений расположены в стеке» неверно. Например:

class Foo
{
    int x;
}

int является типом значения, но значение для x всегда будет в куче, поскольку оно будет храниться вместе с остальными данными для экземпляра Foo, который является классом.

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

У меня есть статья о куче / стековой памяти C # , которую вы можете найти полезной, но вы также можете прочитать сообщение Эрика Липперта в блоге на «Стек - это деталь реализации», В частности, будущий компилятор C # может решить сохранить все свои локальные переменные в куче, используя стек только для хранения ссылки на экземпляр, созданный в начале метода ... который не будет игнорировать спецификацию C # в все.

3 голосов
/ 15 июля 2009

Тип значения «выделяется» там, где он определен.

Что это означает, зависит от того, где вы его определяете:

  • В классе / структуре, как поле в этой структуре, расширение класса / структуры в памяти, чтобы соответствовать значению типа значения там
  • Как локальная переменная в методе, в стеке, или как регистр, или как поле в сгенерированном классе (при использовании "замыканий"), в зависимости от оптимизации
  • В качестве параметра метода, в стеке или в регистре, в зависимости от оптимизации

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

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

Когда вы создаете объект из класса, в куче выделяется пространство для размещения всех полей этого класса + некоторые накладные расходы в этом пространстве.

Кажется, я вспомнил, что у Джона Скита была статья на эту тему, я уверен, что он очень скоро ответит, так что следите за обновлениями.

2 голосов
/ 10 марта 2010

Запомните правило: ссылочные типы всегда идут в кучу, тогда как типы значений всегда идут туда, где они были объявлены. Если тип значения объявлен вне метода, но внутри ссылочного типа, он будет помещен в ссылочный тип в куче.

2 голосов
/ 15 июля 2009

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

http://www.simple -talk.com / DotNet / .net-основа / understanding-garbage-collection-in-.net /

1 голос
/ 15 июля 2009

Когда вызывается метод, объем пространства, требуемый типами значений, известен заранее (он может быть вычислен компилятором). Это пространство выделяется в стеке и доступно только на время вызова метода. При каждом вызове нового метода объем памяти, используемой в стеке, увеличивается, а при выходе из метода он возвращается к своему предыдущему уровню.

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

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