在IL中,您可以使用.locals
指令定义局部变量。这些变量存储在哪里,堆栈还是堆?
答案 0 :(得分:9)
在带有参数的堆栈上。 .. 但是 .....
1)对于引用类型,只有引用存储在堆栈上而不是它所引用的对象上。实际对象存储在堆上
2)对于值类型,实际值存储在堆栈中。
现在,当方法中的执行流程到达右括号时,堆栈上的值类型数据将被销毁,然后,堆上的引用类型对象(其引用位于此处)方法的堆栈)被移交给垃圾收集系统,以便在垃圾收集器本身决定的适当时间进行收集。
答案 1 :(得分:9)
这是JIT编译器的一个实现细节。它会非常努力地将本地变量存储在CPU寄存器中,效率非常高。堆栈是通常的后备存储,以防没有足够的寄存器来存储所有局部变量。
例如x86和x64抖动之间的巨大差异。 x64有更多可用的寄存器。这也适用于传递给方法的参数。 x86允许2在CPU寄存器中传递,x64允许4.加上可以存储在FPU堆栈或XMM寄存器中的任何内容。因此,可以存储局部变量的四个不同位置。
答案 2 :(得分:4)
如果对象不是值类型,则在堆上分配它,并且对它的引用存储在堆栈中。否则,它直接在堆栈上分配。