【发布时间】:2021-09-30 06:44:17
【问题描述】:
在我目前的理解中,当一个函数或一个方法被调用时,与这个方法相关的数据,比如MethodA,被存储在一个堆栈帧中,以便在这个方法的执行过程中被跟踪。而如果这个方法又调用了另一个方法,比如MethodB,那么与MethodB相关的数据将被存储在另一个堆栈帧中,该堆栈帧将被放在MethodA的堆栈帧顶部。
-
请问,在 C# 中,这些堆栈帧是否存储在堆栈中?还是它们位于不同的地方?
-
如果堆栈帧位于堆栈上,并且说堆栈帧中是否有一些引用类型的数据,请问存储在这些堆栈帧中的那些数据的值是否是对象的引用指向堆?或者如果在这种情况下对象本身存储在堆栈上的堆栈帧中?
非常感谢!
【问题讨论】:
-
“堆栈框架”是一个实现细节,而不是特定于 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#