举个例子,我已经为值类型分配了一个值
int i=0;
int j=1;
由于 int
是一个值类型变量,因此在堆栈中分配的内存如下(将 I 和 j 的值压入堆栈):
|_|<-- stack top
|1|<--j value
|0|<--i value
我对这个分配没有什么疑问:
- 如果此时执行
i+=1
,堆栈分配会发生什么变化? - 如何在不弹出
j
的情况下弹出i
的值 - 如果我重新分配
i
的值,那么该值将存储在堆栈顶部,此时先前分配的值会发生什么:
最佳答案
您的心智模型严重损坏,您对“堆栈”这个词的理解太字面意思了。只有当一种方法调用另一种方法时,处理器堆栈才像堆栈一样工作。在方法中,参数和局部变量存储在 stack frame
中。 .它是可自由寻址的,没有推送或弹出。始终作为基址指针寄存器或堆栈指针寄存器的偏移量。 32 位代码的 EBP,64 位代码的 RSP。堆栈帧的大小取决于局部变量的数量。它只是通过按帧大小递减堆栈指针来“分配”。并通过简单地恢复堆栈指针来“销毁”。
如果将其建模为 C#,您会更接近 Stack<object[]>
数据结构。
Wikipedia article应该有助于澄清这个概念。
关于c# - 值类型变量是否违反栈的LIFO性质,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32367356/