c# – 值类型变量是否违反堆栈的LIFO性质

我已经为值类型分配了一个值,例如

int i=0;
int j=1;

由于int是值类型变量,因此内存在堆栈中按如下方式分配(将I和j的值推送到堆栈):

|_|<-- stack top
|1|<--j value
|0|<--i value

我对这个分配几乎没有疑问:

>如果我在这个时间执行i = 1,那么堆栈分配的变化是什么?
>如何在不弹出j的情况下弹出i的值
>如果我重新分配i,那么该值将存储在堆栈顶部,在这个时间内,先前分配的值会发生什么:

最佳答案 你的心理模型严重受损,你的字面意思是“堆叠”.仅当一个方法调用另一个方法时,处理器堆栈的行为类似于堆栈.在方法中,参数和局部变量存储在堆栈帧中.它可以自由寻址,不会推或弹.始终作为基址指针寄存器或堆栈指针寄存器的偏移量. EBP采用32位代码,RSP采用64位代码.堆栈帧的大小取决于局部变量的数量.简单地通过按帧大小递减堆栈指针来“分配”它.并简单地通过恢复堆栈指针“销毁”.

如果你把它建模为C#Stack< object []>你会更接近数据结构.

Wikipedia article应该有助于澄清这个概念.

点赞