嗨,我一直在寻找这个问题的答案。 我想了解有关我的代码何时占用内存的幕后情况。
例如。 int myVar;
- 这段代码已经占用内存了吗?我所说的内存是指堆栈吗? 最初在 .NET 中,我注意到这一行的默认值是 ZERO(0)。
- 但是这个变量到底存储了什么?值 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/