2010-09-29 113 views

回答

9

这是非常多的JIT编译器的实现细节。它会尽力将局部变量存储在CPU寄存器中,非常高效。如果没有足够的寄存器可用于存储所有本地变量,堆栈就是常用的后备存储。在x86和x64抖动之间例如

很大的区别。 x64有更多的寄存器可用。这也适用于传递给方法的参数。 x86允许2通过一个CPU寄存器,x64允许4.加上任何可以存储在FPU堆栈或XMM寄存器中的内容。所以,实际上有四个不同的地方可以存储局部变量。

+0

+1,当谈到IL时,对于当地人和参数有很多混淆。 IL与一个操作栈协同工作,但这并不直接对应于一个“调用栈”,比如C编译器用'cdecl'或'stdcall'调用约定生成的调用栈。参数和当地人都被视为编号插槽;与调用堆栈相似的唯一区域是何时从操作堆栈中弹出用于加载到方法调用的参数槽中的方法调用参数。 – 2010-09-29 15:24:18

4

如果对象不是值类型,它是在堆上分配和对它的引用被存储在堆栈中。否则,它直接分配在堆栈上。

9

在堆栈的参数。 .. BUT .....
1)对于引用类型,只有参考存储在堆栈不是对象其参照上。实际的对象存储在堆上。
2)对于值类型,实际值存储在堆栈上。

现在,当在所述方法中执行流到达关闭支架堆栈上的值的类型的数据被破坏那里,然后,同时在堆上引用类型的对象(其引用在这里该方法的堆栈上)是交由垃圾收集系统在垃圾收集器本身决定的适当时间收集。

+2

这也太出于同样的原因,如标记的答案非常误导。另外,绝对没有破坏正在发生。无论是在IL还是机器代码中。堆栈位置简单地被放弃并最终被另一个激活堆栈框架覆盖。即使引用类型在堆上的概念也不准确。实际的字符串实际上存储在加载器堆中,静态变量保存的地方。细节,细节。 – 2010-09-29 15:20:14

+0

@Hans:感谢您的详细资料......感谢您的解释。 – explorer 2010-09-29 15:54:11

相关问题