首页 > 解决方案 > .NET CLI:如果不在顶部,局部变量如何从堆栈中弹出?

问题描述

我试图弄清楚堆栈和堆是如何工作的。

所以我关于堆栈的问题。例如,我们有下一个代码:

static void Main()
{
    int a = 1;
    int b = 2;

    Console.WriteLine(a);
}

两个变量都将被压入堆栈,变量“b”将位于变量“a”之上。

如果 Stack 只有 Push 和 Pop 操作,如何读取变量 'a' 而不会从堆栈 'b' 中弹出?

标签: .net

解决方案


局部变量是在堆栈的动态/灵活部分之前定义的,所以你实际拥有的是(假设没有优化):

  • 在堆栈帧中定义 a & b
  • 将 1 推入动态堆栈(a 和 b 之后)
  • 将堆栈顶部的值写入(弹出)到 a 的位置
  • 将 2 压入动态堆栈
  • 将栈顶的值写入(pop)到b的位置
  • 将值从 a 的位置加载(推送)到动态堆栈上
  • 调用 Console.WriteLine

可以随时访问局部变量值;它们只是堆栈帧的相对偏移量。用于瞬态值的堆栈的动态部分通常只能以严格的顺序访问,但这不是包含我们命名为 a 和 b 的位置的内容。


推荐阅读