我对C#中的堆栈变量有疑问,请看下面的示例:
static void Main(string[] args)
{
int a = 1; //this element goes to the stack as the first one
int b = 2; //second element in the stack
a = 4;
a++;
}
如何在不从堆栈弹出变量“b”的情况下更改变量“a”的值?
如果有人解释我在这种情况下是如何运作的,我将不胜感激?
答案 0 :(得分:1)
.NET用来保存值类型的内存构造确实称为“堆栈”,但它并不意味着每个变量都保存在LIFO结构中,您可以在其中只访问最后一个。
因此,要回答您的问题 - 当您需要访问变量a
时 - CLR会完全执行此操作(即直接访问它),此处无需弹出任何内容。
您可以阅读更多相关信息,例如:http://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/。
答案 1 :(得分:0)
本地变量确实位于堆栈上,但编译器会隐藏堆栈。基本上,它将变量转换为相对于堆栈顶部的地址。在您的示例中,编译器知道b是堆栈中的最后一个东西,而且是最后一个。
执行某个功能时,一个寄存器(经典8086处理器上的SP,现在可能是ESP或其他东西)指向堆栈顶部的地址。函数参数和局部变量的地址为[SP + n],其中n是堆栈顶部的字节数。