爲啥內存需要堆?

翻譯自:https://www.quora.com/Why-are-heaps-used-for-memory-allocation-Why-arent-stacks-or-any-others-used

我們需要知道的最重要的事情是棧的功能和堆的功能這兩者是有顯著區別的。

在一個典型的編程語言中,在一個方法調用的時候,一個“棧幀”就會被創建出來。隨後,所有的該方法的本地變量就會在這個棧幀的範圍中被創建。然後,當這個方法返回的時候,該方法的棧幀就被“刪除”了。這些都是“自動”的。高層開發人員不需要在方法調用的時候去創建棧幀,也不需要在本地變量創建或使用的時候把它們放到棧幀上,也不需要在方法返回的時候刪除棧幀。底層的運行時系統會提供上述所有的功能。

但是,從根本上來說,棧還有個大問題:變量(或對象)等在棧幀上生成,但是所有的變量和對象也會隨着方法的返回一起消失!所以,如果你想要使一個變量在多個方法中共享,那麼,棧不像是一個能夠創建該變量的好的地方。

也就是說,我們需要有一個地方能夠創建跨越方法調用的變量。這個地方顯然不是在棧中。我們把這個可以用來隨意放數據的內存堆叫做什麼呢?Hmm!就叫堆好了,大概我們的計算機大佬們就是這樣決定的。

另外一個非常重要的點是你在堆上可以“隨意地”分配,只要堆還有空間,內存分配就會成功。從另一個角度說,你在堆上分配的所有內存可以在任意時間被釋放掉!而棧不會給你這個“在棧上釋放對象的”自由因爲這可能導致棧運行混亂掉。

內存中的棧用數據結構中的棧來實現剛好是個巧合,但是內存的堆和數據結構中的堆沒有任何關係。在這種情況下,我感覺我們只需要把堆看成內存的中的“一堆”就好了…意味着一塊大的,無條理的內存區域,我們可以在這塊內存區域上存儲數據,也可以刪除數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章