2

嗨,我一直在寻找这个问题的答案很长时间。我想知道关于我的代码何时会占用内存的幕后事情。

前任。int myVar;

  1. 这段代码是否已经占用了内存?内存是指堆栈吗?最初在 .NET 中,我注意到这条线的默认值为零(0)。
  2. 但是变量真正存储的是什么?值 ZERO 还是存储值 ZERO(0) 的地址?

同样从我对引用类型的理解来看,当我编写这行代码时

我的类我的对象;// 只声明

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

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

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

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

代码

Console.WriteLine(FunctionThatReturnsAnInteger());

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

提前致谢。:)

4

1 回答 1

4

性能效率 - 更高效但仅通过几条指令,从执行堆栈存储和加载变量。请记住,抖动可能会在运行时优化您的代码,从而删除任何不必要的指令。

内存效率 - 效率更高,因为在执行堆栈上没有定义本地变量。

代码清晰——变量的定义更接近它的使用位置,使代码更可用。在我看来,将一种方法返回到另一种方法会更加干净,但是确实有缺点,即更难检查返回的值(但是在 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

奖励 - 在声明中为 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
于 2013-08-17T11:41:32.313 回答