使用(新变量或声明新变量)给出参数在 ram 用法上有区别吗?
Does giving arguments with (new or declaring new variable) has difference in ram usage?
前几天我在编程,我很好奇是否
用新的
给出参数
Application.Run(new Form1());
或声明新变量
Form1 form1 = new Form1();
Application.Run(form1);
在内存使用、速度等方面存在差异
它们有什么不同吗?
不,没有区别。 Application.Run(..) 方法可以保存对 Form 实例的引用。所以 GC 不使用它。当方法结束执行时,是否声明 form1
变量并不重要,因为对它的引用会丢失。
是的,有区别。
我定义了这个方法来显示区别:
public string Run(string param)
{
return param + "!";
}
然后我用这两种方式称呼它:
(1)
var text = "Hello";
Console.WriteLine(Run(text));
(2)
Console.WriteLine(Run("Hello"));
第一个产生这个 IL:
IL_0000: nop
IL_0001: ldstr "Hello"
IL_0006: stloc.0 // text
IL_0007: ldarg.0
IL_0008: ldloc.0 // text
IL_0009: call Run
IL_000E: call System.Console.WriteLine
IL_0013: nop
IL_0014: ret
第二个生成此 IL:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldstr "Hello"
IL_0007: call Run
IL_000C: call System.Console.WriteLine
IL_0011: nop
IL_0012: ret
区别在于 IL stloc.0
。第一种方法在调用之前为 text
变量分配存储空间。第二种方法不行。
虽然差异非常小。
每一个的优化代码是:
(1)
IL_0000: ldstr "Hello"
IL_0005: stloc.0 // text
IL_0006: ldarg.0
IL_0007: ldloc.0 // text
IL_0008: call Run
IL_000D: call System.Console.WriteLine
IL_0012: ret
(2)
IL_0000: ldarg.0
IL_0001: ldstr "Hello"
IL_0006: call Run
IL_000B: call System.Console.WriteLine
IL_0010: ret
存储方面的变化仍然相同 - 只是少了 nop
s。
不同的是在
的情况下
Application.Run(new Form1());
Form1 对象仅在 Run
调用的范围内,并且有资格在之后立即进行垃圾回收。
而
Form1 form1 = new Form1();
Application.Run(form1);
form1
仍在 Run
之后的范围内,并且在块结束之前无法进行 GC。
这可以(可能不是在这种情况下,但对于其他对象)对运行时内存使用有相当大的影响。
前几天我在编程,我很好奇是否
用新的
给出参数Application.Run(new Form1());
或声明新变量
Form1 form1 = new Form1();
Application.Run(form1);
在内存使用、速度等方面存在差异
它们有什么不同吗?
不,没有区别。 Application.Run(..) 方法可以保存对 Form 实例的引用。所以 GC 不使用它。当方法结束执行时,是否声明 form1
变量并不重要,因为对它的引用会丢失。
是的,有区别。
我定义了这个方法来显示区别:
public string Run(string param)
{
return param + "!";
}
然后我用这两种方式称呼它:
(1)
var text = "Hello";
Console.WriteLine(Run(text));
(2)
Console.WriteLine(Run("Hello"));
第一个产生这个 IL:
IL_0000: nop
IL_0001: ldstr "Hello"
IL_0006: stloc.0 // text
IL_0007: ldarg.0
IL_0008: ldloc.0 // text
IL_0009: call Run
IL_000E: call System.Console.WriteLine
IL_0013: nop
IL_0014: ret
第二个生成此 IL:
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldstr "Hello"
IL_0007: call Run
IL_000C: call System.Console.WriteLine
IL_0011: nop
IL_0012: ret
区别在于 IL stloc.0
。第一种方法在调用之前为 text
变量分配存储空间。第二种方法不行。
虽然差异非常小。
每一个的优化代码是:
(1)
IL_0000: ldstr "Hello"
IL_0005: stloc.0 // text
IL_0006: ldarg.0
IL_0007: ldloc.0 // text
IL_0008: call Run
IL_000D: call System.Console.WriteLine
IL_0012: ret
(2)
IL_0000: ldarg.0
IL_0001: ldstr "Hello"
IL_0006: call Run
IL_000B: call System.Console.WriteLine
IL_0010: ret
存储方面的变化仍然相同 - 只是少了 nop
s。
不同的是在
的情况下Application.Run(new Form1());
Form1 对象仅在 Run
调用的范围内,并且有资格在之后立即进行垃圾回收。
而
Form1 form1 = new Form1();
Application.Run(form1);
form1
仍在 Run
之后的范围内,并且在块结束之前无法进行 GC。
这可以(可能不是在这种情况下,但对于其他对象)对运行时内存使用有相当大的影响。