究竟是什么,与“.Net”有关的“堆栈”

时间:2010-01-10 07:30:07

标签: .net vb.net stack

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

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

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

我尝试向谷歌寻求答案,但只找到了关于'堆栈'的信息以及如何使用它。

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

也许我只是愚蠢 - 但我认为我可以想象一个具有递归函数的情况,它可以方便地查看变量的先前值 - 来自“堆栈”但不需要传递它in。

Dunno,如果这有任何意义 - 它已经非常晚了。但我真的很感激任何人的任何信息。

1 个答案:

答案 0 :(得分:18)

该术语指的是call stack。您可以了解更多有关低级编程或计算机体系结构/组织课程中的概念的信息,您可以选择一个。

每当调用一个函数时,返回地址(调用它的地方)以及函数的参数都被压入“堆栈”(内存中的堆栈,但不是,而不是C#堆栈数据结构)您在MSDN上阅读的内容)。当函数终止时,地址将从堆栈中弹出,控件将恢复原来的位置(在弹出的地址处)。与函数调用有关的信息(局部变量,返回地址,参数等)称为“堆栈帧”。

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

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