【发布时间】:2010-09-29 14:16:05
【问题描述】:
在 IL 中,您可以使用 .locals 指令定义局部变量。这些变量存储在哪里,堆栈还是堆?
【问题讨论】:
标签: .net local-variables
在 IL 中,您可以使用 .locals 指令定义局部变量。这些变量存储在哪里,堆栈还是堆?
【问题讨论】:
标签: .net local-variables
这在很大程度上是 JIT 编译器的实现细节。它将非常努力地将局部变量存储在 CPU 寄存器中,非常高效。堆栈是通常的后备存储,以防没有足够的寄存器可用于存储所有局部变量。
例如,x86 和 x64 抖动之间的巨大差异。 x64 有更多可用的寄存器。这也适用于传递给方法的参数。 x86 允许在 CPU 寄存器中传递 2 个,x64 允许 4 个。加上可以存储在 FPU 堆栈或 XMM 寄存器中的任何内容。所以,实际上有四个不同的地方可以存储一个局部变量。
【讨论】:
在带有参数的堆栈上。 ..但是 .....
1) 对于引用类型,只有引用存储在堆栈中,而不是它所引用的对象。实际对象存储在堆上。
2) 对于值类型,实际值存储在堆栈中。
现在,当方法中的执行流程到达右大括号时,堆栈上的值类型数据在此处被销毁,然后在堆上的引用类型对象(其引用在此方法的堆栈)在垃圾收集器自己决定的适当时间移交给垃圾收集系统进行收集。
【讨论】:
如果对象不是值类型,则将其分配在堆上,并将对它的引用存储在堆栈上。否则直接在栈上分配。
【讨论】: