.net - .NET CLI:如果不在顶部,局部变量如何从堆栈中弹出?
问题描述
我试图弄清楚堆栈和堆是如何工作的。
所以我关于堆栈的问题。例如,我们有下一个代码:
static void Main()
{
int a = 1;
int b = 2;
Console.WriteLine(a);
}
两个变量都将被压入堆栈,变量“b”将位于变量“a”之上。
如果 Stack 只有 Push 和 Pop 操作,如何读取变量 'a' 而不会从堆栈 'b' 中弹出?
解决方案
局部变量是在堆栈的动态/灵活部分之前定义的,所以你实际拥有的是(假设没有优化):
- 在堆栈帧中定义 a & b
- 将 1 推入动态堆栈(在a 和 b 之后)
- 将堆栈顶部的值写入(弹出)到 a 的位置
- 将 2 压入动态堆栈
- 将栈顶的值写入(pop)到b的位置
- 将值从 a 的位置加载(推送)到动态堆栈上
- 调用 Console.WriteLine
可以随时访问局部变量值;它们只是堆栈帧的相对偏移量。用于瞬态值的堆栈的动态部分通常只能以严格的顺序访问,但这不是包含我们命名为 a 和 b 的位置的内容。
推荐阅读
- javascript - 使用 setState 设置存储在以太坊区块链中的对象字段
- kubernetes - 所有命名空间的 GKE Workload Identity 服务帐号
- arrays - 取号码、日期和时间;从顶部搜索等于或更多的数字;显示来自已建立号码左侧的 2 行的信息
- angular - 反应形式的Angular 6 datepipe问题
- android - Firestore 查询最终会为相同的信息创建多个推送通知
- java - 上传时如何向 S3AsyncClient 添加凭据
- c# - 在 MVVM 应用程序中将单位转换(英尺/米/公里)放在哪里?
- reporting-services - 如何在矩阵上显示行组和总计百分比
- c - “%[^\n]s”和“%[^\n]s”有什么区别
- php - 如何将 CURL 命令转换为 Guzzle HTTP