【问题标题】:Where are the stack frames and the data in it stored? [duplicate]堆栈帧和其中的数据存储在哪里? [复制]
【发布时间】:2021-09-30 06:44:17
【问题描述】:

在我目前的理解中,当一个函数或一个方法被调用时,与这个方法相关的数据,比如MethodA,被存储在一个堆栈帧中,以便在这个方法的执行过程中被跟踪。而如果这个方法又调用了另一个方法,比如MethodB,那么与MethodB相关的数据将被存储在另一个堆栈帧中,该堆栈帧将被放在MethodA的堆栈帧顶部。

  1. 请问,在 C# 中,这些堆栈帧是否存储在堆栈中?还是它们位于不同的地方?

  2. 如果堆栈帧位于堆栈上,并且说堆栈帧中是否有一些引用类型的数据,请问存储在这些堆栈帧中的那些数据的值是否是对象的引用指向堆?或者如果在这种情况下对象本身存储在堆栈上的堆栈帧中?

非常感谢!

【问题讨论】:

  • “堆栈框架”是一个实现细节,而不是特定于 C# 的东西。顾名思义,“堆栈帧”确实存储在“堆栈上”,这应该是非常明显的。有关堆栈帧的大量详细信息,请参阅副本。对于您的第二个问题(应该作为第二个问题发布),请参阅网站上讨论引用类型的许多问答,例如stackoverflow.com/questions/30838504/…,当然还有stackoverflow.com/questions/5057267/…
  • @PeterDuniho 感谢您的评论。看到dcs.warwick.ac.uk/oldmodelling/other/eden/advanced/notes/…这篇文章,在想是否可以用某种编程语言把frame从栈中分离出来。
  • @PeterDuniho “从名字上看,“堆栈框架”确实存储在“堆栈上”,这应该是非常明显的。来吧,这是没有必要的。 System.Collections.Generic.Stack<T> 的每个实例都存储在堆栈中,因为它们具有相同的名称,是否也应该“非常明显”?
  • @DanielMcLaury:对不起,你是对的。也许相反,我应该写“对于任何真正在谷歌上搜索过'stack frame'这个短语的人来说,这应该是非常明显的......”,因为第一次点击是这篇 Stack Overflow 文章:stackoverflow.com/questions/10057443/…,它具体解释了堆栈帧的位置生活,接下来的十个左右至少搜索结果。我希望你不要试图为这个问题辩护,好像它显示了任何研究证据或类似的东西。
  • @PeterDuniho 我应该写“确认”而不是“询问”。我确实注意到了其中一些文章,但我不确定这是否完全适用于 C#,因为我是 C# 的初学者以及那些实现细节。对于提出不好的问题,我们深表歉意。

标签: c#


【解决方案1】:

请问,在 C# 中,这些堆栈帧是否存储在堆栈中?还是它们位于不同的地方?

是的,这就是为什么它被称为“堆栈”。这是一堆调用帧。当我们说变量存储在“堆栈上”时,我们的意思是它存储在这些调用框架之一中。它是一个堆栈的原因是,当一个函数返回时,它的调用框架可以被弹出,我们可以返回到调用函数。

如果堆栈帧位于堆栈上,并且说堆栈帧中是否有一些引用类型的数据,请问存储在这些堆栈帧中的那些数据的值是否是对象的引用?或者如果在这种情况下对象本身存储在堆栈上的堆栈帧中?

如果您的引用类型方法中有一个局部变量,这意味着您的调用帧包含一些字节,这些字节保存该对象在堆上的地址。

【讨论】:

  • 感谢您的回答,我可以再问一个与您对第二个问题的回答相关的问题吗?如果我们在方法中有一些全局变量或任何非局部变量值类型,它们是通过引用访问的(到它在堆栈上的位置)吗?还是通过其他方式访问它们?
  • [删除/转发以消除白痴;谢谢@mjwills] C# 没有全局变量。类的静态成员存储在堆的特殊部分中。它们不能存在于堆栈中,因为堆栈中的所有内容都会在它所在的函数退出后立即消失。
  • 请问如果静态成员没有被装箱,他们是如何生活在堆上的?
  • @J-A-S:mjwills 在这里提供了一个链接,他在评论中删除了该链接,但请参阅 stackoverflow.com/questions/25741795/…
  • 感谢您的链接。我可以进一步问,由于这些值类型的静态成员存在于堆上,堆栈帧中的变量是否通过它们在堆上的引用来访问它们?那么,它们的行为是否像引用类型?
猜你喜欢
  • 1970-01-01
  • 2015-06-02
  • 2014-04-21
  • 2011-06-25
  • 2015-05-27
  • 1970-01-01
  • 2019-03-16
  • 2014-08-14
  • 2017-06-15
相关资源
最近更新 更多