2010-01-10 123 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

相關問題