2010-01-10 93 views
8

原谅我,如果这是一个愚蠢的问题,但我怕我不知道'堆'是什么。什么是'堆栈',因为它与.Net

我知道什么是“堆”是,我已经学会了FILO/FIFO的缩写。但是当人们说'价值类型被分配到堆栈而不是堆'时 - 恐怕我不知道这意味着什么。

当我介绍了一个逻辑错误成一个递归函数 - 我无法分配更多的内存来“堆”和我的应用程序崩溃....但我真的不明白它是什么。

我想谷歌的答案,但只发现了“堆栈”,以及如何使用一个信息。

当我运行一个.net应用程序 - 它创建一个单独的“栈实例”充当“堆栈”?我见过堆栈跟踪,显示代码的执行级别 - 大多数情况下,当我遇到一个不受欢迎的异常时......但我记得能够看到的是他们所调用的方法和顺序......不会堆栈的每个步骤都有范围内的所有变量。

也许我只是愚蠢 - 但我想我可以想象一个递归函数的情况,它可以方便地查看变量的前一个值 - 从'堆栈'但不需要传递它在。

不知道如果这是有道理的 - 这是非常晚。但我真的很感谢任何人的信息。

+0

当你不能分配任何更多的内存,我猜,是由具有无限递归,这将意味着在某些时候造成的,电脑不会有足够的内存来计算递归。 – 2010-01-10 07:48:14

+1

短语*“值类型在堆栈上分配”*不完全准确。看到这里的更多信息:http://stackoverflow.com/questions/1130468/memory-allocation-of-value-types-and-reference-types-in-net-framework – 2010-01-10 07:51:33

+0

顺便说一句,“堆与堆栈” ,这里是一个简短的总结:http://ee.hawaii.edu/~tep/EE160/Book/chap14/subsection2.1.1.8.html – 2010-01-10 07:53:48

回答

18

该术语指的是call stack。您可能会在低级别编程或计算机体系结构/组织课程中了解更多关于这些概念的内容,您是否需要参加。

每当函数被调用时,返回地址(从中调用的地址)以及函数的参数都被压入“堆栈”(内存中的堆栈,但不是C#堆栈数据你在MSDN上阅读过的结构)。当一个函数终止时,地址从堆栈中弹出,控制器恢复原来的位置(在弹出的地址处)。与函数调用有关的信息(局部变量,返回地址,参数等)被称为“栈帧”。因此,当你使用递归(并且它在一个无限递归循环中被捕获)时,你实际上只是用返回地址(和其他数据)填充堆栈,直到没有剩余空间为止。

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

+0

是的,我很感激我的知识有空白清除。 :) – Sapph 2010-01-10 07:55:20

+0

或者至少把2x4放在他们身上.... – 2010-01-10 08:01:00

+0

非常有帮助。谢谢 – 2010-01-10 08:36:21