c# - 声明变量是否已经占用内存

标签 c# .net performance memory-management

嗨,我一直在寻找这个问题的答案。 我想了解有关我的代码何时占用内存的幕后情况。

例如。 int myVar;

  1. 这段代码已经占用内存了吗?我所说的内存是指堆栈吗? 最初在 .NET 中,我注意到这一行的默认值是 ZERO(0)。
  2. 但是这个变量到底存储了什么?值 ZERO 还是存储值 ZERO(0) 的地址?

根据我对引用类型的理解,当我编写这行代码时

MyClass myObj;//仅声明

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

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

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

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

代码

Console.WriteLine(FunctionThatReturnsAnInteger());

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

提前致谢。 :)

最佳答案

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

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

代码清晰 - 变量的定义更接近其使用位置,使代码更可用。在我看来,将一种方法返回到另一种方法会更干净,但也有缺点,即更难检查返回的值(但在 VS 2013 中这是可能的)。

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

奖励 - 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

关于c# - 声明变量是否已经占用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18140630/

相关文章:

c# - 这两个 Java 和 C# 语句是否相等?

visual-studio - 如何为多项目解决方案加快Visual Studio 2008?

java 使用 JPanel 进行屏幕截图预览

java - 多个日期条目之间的锻炼间隙

c# - 如何强制 Serilog 只记录我的自定义日志消息

c# - 替代 INotifyCollectionChanged

c# - 当默认音频输入更改时,.NET 中是否有事件?

c# - 如何将 Gridview 的选定行值插入 .net 中的数据库

c# - 如何使用 EF Code-First 插入/更新可更新 View

mysql - WHERE 与 HAVING 具有多个 IF/LIKE 的计算字段