.NET局部变量存储在哪里?

the*_*oop 12 .net local-variables

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

exp*_*rer 9

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

现在,当方法中的执行流程到达结束括号时,堆栈上的值类型数据将被销毁,然后,堆上的引用类型对象(其引用位于此方法的堆栈中)将被移交给垃圾回收由垃圾收集器本身决定的适当时间收集的系统.

  • 由于与明确答案中的原因相同,这也是非常误导的.此外,绝对没有破坏性.在IL和机器代码中都没有.堆栈位置被放弃,最终被另一个激活堆栈帧覆盖.甚至引用类型都在堆上的概念也不准确.实际字符串实际存储在加载程序堆中,与保存静态变量的位置相同.细节,细节. (2认同)

Han*_*ant 9

它是JIT编译器的一个实现细节.它会非常努力地将本地变量存储在CPU寄存器中,效率非常高.堆栈是通常的后备存储,以防没有足够的寄存器来存储所有局部变量.

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