n_enrai49 Asked:2022-08-30 03:06:03 +0800 CST2022-08-30 03:06:03 +0800 CST 2022-08-30 03:06:03 +0800 CST 将数据覆盖为值类型时,是否创建新变量 772 例如创建一个变量 int a=5; 在代码中它更改为 a=10; 问题:在堆栈上写入5的内存单元中,值本身变为10,或者为它分配了一个新的内存区域并在那里写入了10,而5仍然在内存中? c# 1 个回答 Voted Best Answer aepot 2022-08-30T20:16:55+08:002022-08-30T20:16:55+08:00 至于局部变量,我们看看这段代码编译后会变成什么 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。如您所见,RAM 部分被覆盖,没有分配新内存。
至于局部变量,我们看看这段代码编译后会变成什么
这就是编译的汇编程序
不使用堆栈,不使用内存,只使用处理器寄存器
ECX
。由于处理器寄存器总是存在的,我们可以说内存分配或任何消耗额外计算机资源的实体的创建都不会被创建,无论是在第一种情况下,还是在第二种情况下。如果变量是类的成员
结果会是这样
[ESI+4]
是内存位置的地址a
。如您所见,RAM 部分被覆盖,没有分配新内存。