При перезаписи данных в тип значения создается новая переменная или нет

Например, создается переменная int a=5; после в коде она изменяется на a=10; вопрос: в ячейке памяти в стеке, куда было записано 5 изменилось само значение на 10 или выделилась новая область памяти под нее и туда записалась 10 а 5 так и осталась в памяти?


Ответы (1 шт):

Автор решения: aepot

Что касается локальных переменных, то давайте посмотрим во что превратится этот код после компиляции

int a = 5;
Console.WriteLine(a);
a = 10;
Console.WriteLine(a);

А вот во что, откомпилированный ассемблер

mov ecx, 5
call System.Console.WriteLine(Int32)
mov ecx, 10
call System.Console.WriteLine(Int32)

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

Если же переменная будет членом класса

private int a;
a = 5;
Console.WriteLine(a);
a = 10;
Console.WriteLine(a);

То получится вот так

mov dword ptr [esi+4], 5
mov ecx, [esi+4]
call System.Console.WriteLine(Int32)
mov dword ptr [esi+4], 10
mov ecx, [esi+4]
call System.Console.WriteLine(Int32)

[ESI+4] - это адрес ячейки памяти, где лежит a. Как видно, происходит перезапись участка оперативы, новой памяти не выделяется.

→ Ссылка