声明变量已经占用了内存

时间:2013-08-09 05:38:59

标签: c# .net performance memory-management

您好我一直在寻找答案。 我想知道关于何时我的代码占用内存的问题。

实施例。  int myVar;

  1. 此代码是否已占用内存?通过内存我的意思是堆栈? 最初在.NET中我注意到这一行的默认值为ZERO(0)。
  2. 但变量真的存储了什么?值ZERO或存储值ZERO(0)的地址?
  3. 另外,根据我对参考类型的理解,当我编写这行代码时

    MyClass myObj; //仅声明

    myObj = new MyClass()//创建实例

    我想知道引擎盖下发生了什么。我的假设是否正确? myObj将驻留在堆栈中,myObj能够存储地址。并在我创建一个实例 该对象在堆上创建,该对象的地址传递给myObj变量。

    问题是,我想知道下面两者之间的效率是否更高(内存方面和性能方面)。

    代码1:  int myVar;  myVar = FunctionThatReturnsAnInteger();  Console.WriteLine(myVar的);

    代码

    Console.WriteLine(FunctionThatReturnsAnInteger());

    我想要一个很好的解释,类比非常方便。

    提前致谢。 :)

1 个答案:

答案 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