12

.locals在 IL 中,您可以使用指令定义局部变量。这些变量存储在哪里,堆栈还是堆?

4

3 回答 3

9

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

现在,当方法中的执行流程到达右大括号时,堆栈上的值类型数据被销毁,然后堆上的引用类型对象(其引用在此方法的堆栈上)被移交给垃圾收集系统在适当的时间进行收集,由垃圾收集器自己决定。

于 2010-09-29T14:26:29.557 回答
9

它在很大程度上是 JIT 编译器的实现细节。它将非常努力地将局部变量存储在 CPU 寄存器中,非常高效。堆栈是通常的后备存储,以防没有足够的寄存器可用于存储所有局部变量。

例如,x86 和 x64 抖动之间的巨大差异。x64 有更多可用的寄存器。这也适用于传递给方法的参数。x86 允许在 CPU 寄存器中传递 2 个,x64 允许 4 个。加上可以存储在 FPU 堆栈或 XMM 寄存器中的任何内容。所以,实际上有四个不同的地方可以存储一个局部变量。

于 2010-09-29T14:41:34.077 回答
4

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

于 2010-09-29T14:24:47.733 回答