.net - 'The Stack' 到底是什么,因为它与 .Net 有关

标签 .net vb.net stack

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

我知道什么是“堆栈”,并且了解了 FILO/FIFO 缩写词。但是,当人们说“值类型分配在堆栈上,而不是堆上”时,恐怕我并不真正知道这意味着什么。

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

我尝试通过 Google 寻找答案,但只找到了有关“堆栈”以及如何使用堆栈的信息。

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

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

不知道这是否有意义 - 已经太晚了。但我真的很感激任何人提供的任何信息。

最佳答案

该术语指的是 call stack 。如果您参加低级编程或计算机体系结构/组织类(class),您可能会学到更多有关概念的信息。

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

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

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

关于.net - 'The Stack' 到底是什么,因为它与 .Net 有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2036421/

相关文章:

c - c 中函数不能返回 null

asp.net - 如何在 Log4Net 目录中指定日期?

data-structures - 计算机研究中数据结构的实际例子?

.net - 忽略传递给 Type.GetType() 的程序集限定名称中的版本

c# - VB.Net 中的 Protected Set 用于接口(interface)中定义的属性

c# - VB "Financial.Pmt"在 C# 中等效?

vb.net - 当属性绑定(bind)到设置时,奇怪的拆分容器行为

java - 不可修改的堆栈

c# - Entity Framework 在删除前执行更新,我想停止这个

c# - 尝试安装没有强名称的程序集