gpt4 book ai didi

c# - CLR 如何访问 C# 堆栈?

转载 作者:太空狗 更新时间:2023-10-29 22:11:00 25 4
gpt4 key购买 nike

这可能是一个非常简单的问题,但我在 SO 上找不到答案,也不认识我问过的任何人:

我可以像这样编写一个简单的 C# 方法:

private void foo()
{
int a = 1;
int b = 5;
}

如果 CIL 代码(由编译器创建)由公共(public)语言运行时执行,它将在执行控制位于方法内部时在堆栈顶部创建以下字段:

b = 5
a = 1

但是现在,我将方法扩展为访问名为“a”的字段:

private void foo()
{
int a = 1;
int b = 5;
Console.WriteLine(a);
}

现在 CLR 必须访问一个不在堆栈顶部的字段,但是根据 FILO(先进后出)原则,它必须在访问它之前处理请求字段之上的所有字段。

堆栈中请求字段“a”上方的名为“b”的字段会发生什么情况?

CLR 无法删除它,因为它可能会被之后的执行方法使用,那么它会发生什么情况呢?

据我所知,只有两种存储字段的方法,堆栈或堆。将它移到堆上没有多大意义,因为这会占用 CLR 堆栈的所有好处。 CLR 会创建类似第二个堆栈的东西吗?

这究竟是如何运作的?

-编辑-

也许我没有把我的意图解释得足够清楚。

如果我这样写一个方法:

private void foo()
{
int a = 1;
int b = 5;
Console.WriteLine(a);
Console.WriteLine(b);
}

CLR 首先在堆栈上写入 2 个字段,然后以相反的顺序访问它们。

首先,它必须访问字段“a”,但要访问它,CLR 必须处理位于堆栈中字段“a”上方的字段“b”。它不能只是从堆栈中删除字段“b”,因为它必须在之后访问它。

这是如何运作的?

最佳答案

变量不是单独堆叠的;堆栈包含“帧”。每个帧都包含当前方法调用所需的所有变量(局部变量、参数等)。因此,在您的示例中,ab 并排存在于同一帧中,因此无需删除其中任何一个。当方法 foo 完成时,整个堆栈帧从堆栈中弹出,将调用方法的帧留在顶部。

The wikpedia article可以提供一些启示。

关于c# - CLR 如何访问 C# 堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11741415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com