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

标签 c# variables memory stack allocation

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

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/

相关文章:

java - 线程消耗的内存

c - 当您引用数组的未定义元素时,C 中会发生什么?

C# 如何在每天的特定时间通过 Quartz.net 触发例程

c# - 按日期范围搜索记录,如果日期范围为空,则使用 SQL

c# - 如何从 asp.net web api 删除 Azure blob?

c# - WebBrowser 控件 - 防止右键单击

mysql - SELECT INTO MySQL 声明中的多个变量

c++ - Long double 不打印为我用它初始化的常量

C++ - 返回不同的变量类型

performance - 访问各种缓存和主存的大概成本?