在记忆条件下有文字是什么意思?

时间:2017-06-13 22:32:18

标签: c# .net garbage-collection clr

给出以下示例:

//this gets allocated
var foo = 42;

//what happens to 0?
if (foo > 0)
{
}

出于好奇,0在内存消耗/指令方面会发生什么?

我一直认为这是向处理器发出的一些指令而忘记了。没有什么需要存储在RAM中(只要它是文字而不是参考)。

在参与了这个discussion后,我感到很困惑。

0是否以某种方式在内存中分配?是否需要进行垃圾回收?是否有一种可以改变这种情况的文字?

引擎盖下会发生什么?

1 个答案:

答案 0 :(得分:3)

//this gets allocated
var foo = 42;

“已分配”并非真正的正确用词;这是堆栈上的本地值类型;它不是“分配”。它只是ldc.i4 42stloc.0

//what happens to 0?
if (foo > 0)
{
}

同样,这不是一个分配;没有什么可收集的;这只是ldloc.0ldc.i4.0cgtbrfalse.s。没有分配。这里的一切都只是堆栈上的值。 GC指的是托管堆,即对象。

在实现方面:输入方法在堆栈上保留已知的空间量(由编译器计算)。离开方法什么都不做 - 它保持内存不变,只是从使用中的堆栈空间中减去相同的数字。

  

所以0以与foo相同的方式存储在堆栈中?

不太一样; foo是本地的,0是一种短暂的。基本上当地人先来,然后瞬间堆叠空间开始在当地人之后。使用瞬态堆栈空间(至少在理论上 - JIT可以注册它)用于正在进行的操作,包括加载文字值。瞬态区域仅是非正式定义的(JIT理解它,但未正式声明) - 并且仅持续单个操作的持续时间。当地人是按方法范围。