[探索5 分鐘] stack 與heap 的底層概念
文章推薦指數: 80 %
stack 用於靜態記憶體配置, 大陸翻譯為棧, 棧, 棧(why ?) heap 用於動態記憶體配置, 大陸翻譯為堆. 抱怨一下, 堆跟棧我一直覺得命名混亂, 用Google 翻譯也 ...
Skiptomaincontent
[探索5分鐘]stack與heap的底層概念
May23,2017
Labels:
c#
core
ds
這是經典的概念題。
要寫出能動的程式很簡單,要去解釋背後的記憶體管理運用原則,還是需要一點時間內化。
而且不知道為什麼,一般的軟體工程師跟架構師來說這兩個詞,那個講起來那個味道就是不太一樣,有時候面談別人時,還會覺得有些求職者有獨到的見解。
簡單來說,從記憶體配置的角度,用一個二分法
stack用於靜態記憶體配置,大陸翻譯為棧,棧,棧(why?)
heap用於動態記憶體配置,大陸翻譯為堆
抱怨一下,堆跟棧我一直覺得命名混亂,用Google翻譯也會發現stack跟heap都翻譯為堆疊的「堆」,連Google都搞錯了,所以後面還是用英文來說吧。
這張All-in-one的圖是我目前最喜歡的圖像解釋,來源是 Siximportant.NETconcepts:Stack,heap,valuetypes,referencetypes,boxing,andunboxing :
首先記得這個範例,圖片是由上而下逐行介紹,
publicvoidMethod1()
{
inti=4;//Line1
inty=2;//Line2
Class1cls1=newClass1();//Line3
}
總結是:
valuetype的變數,包括指標變數會放在stack
referencetype的變數(如string,object)本身也會放stack,然而他的值(value)則是放heap
box就是valuetypestoreferencetypes的過程,所以value會被放到heap中,而產生一個object變數來指向這個value,變數指標則是在stack
unbox是 referencetypestovaluetypes的過程, 所以原本object所指向的值(heap中)會被複製到stack中並賦予明確valuetype型別
深入Stack
現在回到最原點,我們略懂stack與heap的區別了,但還是沒有一個「感覺」對不對?因為我們不懂why。
我個人建議有空可以K一下這篇 stack (英文,請慎入) 掌握stack的記憶體運作原則,heap的運作待補。
筆記如下:
記憶體-資料存放的角度
記憶體-程式運行的角度
記憶體-資料存放的角度
stack的操作特色是 LIFO (lastin,firstout),所以依序呼叫push(),push(),pop()後,是第二個push進去的資料會被pop出來,而不是第一個(相反的叫FIFO,一般的queue就是這個行為)。
push:addi$sp,$sp,-4#Decrementstackpointerby4
sw$r3,0($sp)#Save$r3tostack
pop:lw$r3,0($sp)#Copyfromstackto$r3
addi$sp,$sp,4#Incrementstackpointerby4
push()的記憶體核心操作其實是在記憶體中的堆疊位址(StackPointer)先往低位址移動 (0x00100000→0x000ffffc),然後在新位址(0x000ffffc)存入資料;相反地,pop()則是先把目前位址(0x000ffffc)的值copy出來(通常我們會想取得pop出來的值的吧,丟掉可惜了),然後記憶體中的堆疊位址再回到上一個SP(0x000ffffc→0x00100000)。
記憶體-程式運行的角度
讓我們從一段C語言程式碼反窺stack如何支持程式運行:
#include
延伸文章資訊
- 1stack vs heap:執行時期儲存兩大要角 - 劉逸的留意世界
當資訊為動態配置產生,系統會存放在另外一塊空間,稱之為『Heap』(注意這裡的Heap跟資料結構中的Heap不相關,可別會錯意!)。Heap的區塊專收執行期間動態 ...
- 2[探索5 分鐘] stack 與heap 的底層概念
stack 用於靜態記憶體配置, 大陸翻譯為棧, 棧, 棧(why ?) heap 用於動態記憶體配置, 大陸翻譯為堆. 抱怨一下, 堆跟棧我一直覺得命名混亂, 用Google 翻譯也 ...
- 3堆積- 維基百科,自由的百科全書 - Wikipedia
堆積(英語:Heap)是電腦科學中的一種特別的完全二元樹。若是滿足以下特性,即可稱為堆積:「給定堆積中任意節點P和C,若P是C的母節點,那麼P的值會小於等於(或大於 ...
- 4[資料結構] 堆積(Heap) - iT 邦幫忙
堆積(Heap),是一種特殊的完全二元樹,而堆疊不一樣,是完全不同的概念。 有分兩種,一種是最小堆積,另一種是最大堆積。 最小堆積. 如下圖,完全二元樹所有的父節點都 ...
- 5[資結] 淺談Heap
Heap呢,有些地方翻做「錐型結構」或「錐疊」,電腦辭典譯作「堆積」,聽起來跟堆疊有點 ... Heap的用途很廣,也有很多奇怪的用途,這裡就不多提囉~.