Когда будет выделена память для переменных, при объявлении или при инициализации? - PullRequest
1 голос
/ 08 января 2020

Рассмотрим два случая в C#

Случай-1

int a;
a = 10;

Где и когда будет выделена память для a?

Дело-2

int a = 10;

В чем разница между этими двумя случаями и как они будут различаться в плане выделения памяти?

Ответы [ 2 ]

3 голосов
/ 08 января 2020

Локальные переменные размещаются в стеке вызовов в момент выполнения кода пролога. Поэтому, прежде чем ваша функция даже будет вызвана, в текущем стековом кадре зарезервированы 4 байта для переменной int (и любых параметров). Эта память исчезает, когда стековый кадр стирается, что и происходит, когда завершается вызов функции. Это то же самое поведение, которое вы увидите в любом стековом языке программирования (по большей части). Для таких общих вопросов лучше всего использовать Google для поиска того, как все работает.

Единственный раз, когда выделяется дополнительная память, это когда вы используете новую. При использовании new, затем память выделяется в куче, и ссылка возвращается на локальную переменную (которая была выделена в точке вызова функции).

Итак, в ответ на ваш вопрос это зависит .

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

MyClass instance = new MyClass();

Первое выделение для экземпляра локальной переменной. Как переменная ref она занимает 4/8 байтов в стеке. Второе распределение происходит в момент выполнения нового. Пространство в куче выделено для MyClass, и вы получаете ссылку, которая затем присваивается вашей (уже выделенной) локальной переменной.

Когда вызов функции завершается, переменная экземпляра стирается (так как кадр стека пропал) ) пока экземпляр MyClass будет зависать до тех пор, пока G C не будет запущен для его очистки.

0 голосов
/ 08 января 2020

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

Редактировать: Когда вы объявляете локальную переменную ссылочного типа, память для стека выделяется для ссылки. При инициализации этой переменной для объекта выделяется память в куче.

...