Эффекты стека и кучи памяти? - PullRequest
0 голосов
/ 07 августа 2011

В следующем коде:

MyClass oMyClass1;
MyClass oMyClass2 = null;

Я сомневаюсь, как две вышеупомянутые строки повлияют на память (стек и куча).

Создать ссылку в стеке?

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

я сомневаюсь, как две вышеупомянутые строки повлияют на память (стек и куча).

Недостаточно информации, 2 варианта:

  1. они являются локальными переменными.В этом случае эти две строки занимают 2 идентичных распределения (ссылки, всегда 32/64 бита) в стеке (когда и как долго выполняется метод).Нет выделений в куче.

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

1 голос
/ 07 августа 2011

Строго говоря, это зависит от того, где находится код.

Если код находится в обычной функции / методе, это повлияет только на стек.Это не повлияет на кучу, поскольку объекты MyClass еще не созданы.

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

Два объявления немного различаются - первое не инициализировано, поэтому любая попытка доступа к oMyClass1 до того, как он будет установлен на что-либо, приведет к ошибке компилятора.Второй инициализируется, поэтому вы не получите ошибку компилятора [хотя вы получите ошибку времени выполнения, если вы получите доступ к методу или свойству oMyClass2 до того, как вы установите его для ссылки на фактический объект, например, с oMyClass2 = new MyClass ();].

Если код находится внутри объявления класса:

class Fred {
    MyClass oMyClass1;
    MyClass oMyClass2 = null;
}

, то он будет выполняться только во время конструктора Fred.Пространство (для объекта Fred, включая пространство для двух ссылок MyClass) уже будет выделено в куче до вызова конструктора.Две строки кода на самом деле не будут иметь никакого эффекта, поскольку пространство уже будет инициализировано нулем.

Если оно находится внутри объявления структуры, эффект будет аналогичным, только в стеке (если структураявляется локальной) или память глобальной переменной (если структура является статической).[Хотя, если честно, я немного не уверен, где статика выделяется в C # - я просто предполагаю, что это делается аналогично C ++]

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