【问题标题】:What, exactly, is 'The Stack' as it pertains to .Net确切地说,与 .Net 相关的“堆栈”是什么
【发布时间】:2011-01-03 10:22:35
【问题描述】:

如果这是一个愚蠢的问题,请原谅我,但恐怕我不知道“堆栈”是什么。

我知道“堆栈”是什么,并且已经了解了 FILO/FIFO 的首字母缩略词。但是当人们说“值类型分配在堆栈上,而不是堆上”之类的话时,恐怕我真的不知道这意味着什么。

当我将逻辑错误引入递归函数时 - 我无法为“堆栈”分配更多内存并且我的应用程序崩溃....但我真的不明白它是什么。

我尝试在 Google 上寻求答案,但只找到关于“堆栈”以及如何使用堆栈的信息。

当我运行 .Net 应用程序时,它会创建一个“堆栈实例”来充当“堆栈”吗?我已经看到了向我显示代码执行级别的堆栈跟踪——最常见的是当我遇到一个未经处理的异常时……但我记得能看到的只是方法和它们被调用的顺序……不会堆栈还包含堆栈每个步骤的所有变量。

也许我只是很傻——但我想我可以想象一个递归函数的情况,在这种情况下,从“堆栈”中查看变量的先前值会很方便,但不需要传递它在。

不知道这是否有任何意义 - 现在已经很晚了。但我非常感谢任何人提供的任何信息。

【问题讨论】:

标签: .net vb.net stack


【解决方案1】:

该术语指的是call stack。您可能会在低级编程或计算机体系结构/组织课程中了解更多有关这些概念的信息,如果您参加的话。

每当调用函数时,返回地址(调用函数的位置)以及函数的参数都会被推送到“堆栈”(内存中的堆栈,但不,不是 C# Stack 数据结构)你在 MSDN 上读到的)。当一个函数终止时,地址从堆栈中弹出,并且控制恢复到原来的位置(在弹出的地址处)。与函数调用有关的大量信息(局部变量、返回地址、参数等)称为“堆栈帧”。

因此,当您使用递归时(并且它陷入无限递归循环),您实际上只是用返回地址(和其他数据)填充堆栈,直到没有剩余空间。

编辑 - 你也提到了the heap。这是存储数据结构的地方(动态内存分配,通过当今大多数语言中的new 关键字,或C 中的malloc)。例如,在 C/C++ 中,堆上的数据一直存在,直到被显式释放。这与存储在堆栈中的本地/自动变量形成对比(因此在它们的作用域终止时被销毁......它们从堆栈中弹出不存在)。

【讨论】:

  • 是的,我希望能够消除我的知识空白。 :)
  • 请注意,在 C# 和 VB.NET 中,“new”并不意味着堆分配,因为它也用于调用值类型构造函数 - 值类型值根据上下文出现在堆栈或堆上.
猜你喜欢
  • 2011-03-06
  • 2010-12-06
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多