给出以下示例:
//this gets allocated
var foo = 42;
//what happens to 0?
if (foo > 0)
{
}
出于好奇,0
在内存消耗/指令方面会发生什么?
我一直认为这是向处理器发出的一些指令而忘记了。没有什么需要存储在RAM中(只要它是文字而不是参考)。
在参与了这个discussion后,我感到很困惑。
0
是否以某种方式在内存中分配?是否需要进行垃圾回收?是否有一种可以改变这种情况的文字?
引擎盖下会发生什么?
答案 0 :(得分:3)
//this gets allocated
var foo = 42;
“已分配”并非真正的正确用词;这是堆栈上的本地值类型;它不是“分配”。它只是ldc.i4 42
,stloc.0
。
//what happens to 0?
if (foo > 0)
{
}
同样,这不是一个分配;没有什么可收集的;这只是ldloc.0
,ldc.i4.0
,cgt
,brfalse.s
。没有分配。这里的一切都只是堆栈上的值。 GC指的是托管堆,即对象。
在实现方面:输入方法在堆栈上保留已知的空间量(由编译器计算)。离开方法什么都不做 - 它保持内存不变,只是从使用中的堆栈空间中减去相同的数字。
所以
0
以与foo
相同的方式存储在堆栈中?
不太一样; foo
是本地的,0
是一种短暂的。基本上当地人先来,然后瞬间堆叠空间开始在当地人之后。使用瞬态堆栈空间(至少在理论上 - JIT可以注册它)用于正在进行的操作,包括加载文字值。瞬态区域仅是非正式定义的(JIT理解它,但未正式声明) - 并且仅持续单个操作的持续时间。当地人是按方法范围。