代码之家  ›  专栏  ›  技术社区  ›  thecoop

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

  •  12
  • thecoop  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  9
  •   Hans Passant    15 年前

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

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

        2
  •  9
  •   explorer    15 年前

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

    现在,当方法中的执行流到达右大括号时 堆栈上的值类型数据在那里被销毁,而堆上的引用类型对象(其引用位于此方法堆栈上)则在垃圾收集器本身决定的适当时间移交给垃圾收集系统进行收集。

        3
  •  4
  •   Justin Rusbatch    15 年前

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

    推荐文章