您好我一直在寻找答案。 我想知道关于何时我的代码占用内存的问题。
实施例。 int myVar;
另外,根据我对参考类型的理解,当我编写这行代码时
MyClass myObj; //仅声明
myObj = new MyClass()//创建实例
我想知道引擎盖下发生了什么。我的假设是否正确? myObj将驻留在堆栈中,myObj能够存储地址。并在我创建一个实例 该对象在堆上创建,该对象的地址传递给myObj变量。
问题是,我想知道下面两者之间的效率是否更高(内存方面和性能方面)。
代码1: int myVar; myVar = FunctionThatReturnsAnInteger(); Console.WriteLine(myVar的);
代码
Console.WriteLine(FunctionThatReturnsAnInteger());
我想要一个很好的解释,类比非常方便。
提前致谢。 :)
答案 0 :(得分:3)
性能效率 - 更高效但仅通过一些指令,从执行堆栈存储和加载变量。请记住,抖动可能会在运行时优化您的代码,删除任何不必要的指令。
内存效率 - 更高效,因为执行堆栈上没有定义本地var。
代码清晰度 - 将变量的定义更接近于使用它的位置使代码更加可用。在我看来,一种方法返回另一种方法甚至更干净,但确实有缺点,更难以检查返回的值(在VS 2013中,这将是可能的)。
带有temp变量的IL:
// Code size 13 (0xd)
.maxstack 1
.locals init ([0] int32 myVar)
IL_0000: call int32 StackOverflowScratchPad.Program::FunctionThatReturnsAnInteger()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: call void [mscorlib]System.Console::WriteLine(int32)
IL_000c: ret
且没有:
// Code size 11 (0xb)
.maxstack 8
IL_0000: call int32 StackOverflowScratchPad.Program::FunctionThatReturnsAnInteger()
IL_0005: call void [mscorlib]System.Console::WriteLine(int32)
IL_000a: ret
Bonus - 在声明中为temp var赋值时的IL:
// Code size 15 (0xf)
.maxstack 1
.locals init ([0] int32 myVar)
IL_0000: ldc.i4.5
IL_0001: stloc.0
IL_0002: call int32 StackOverflowScratchPad.Program::FunctionThatReturnsAnInteger()
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: call void [mscorlib]System.Console::WriteLine(int32)
IL_000e: ret