[探索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
延伸文章資訊
- 1資料結構大便當: Binary Heap
大家好,我是Kadai,資料結構大便當EP.2 要說的是binary heap,雖然早在上資料結構的時候就教過了,但一直以來對binary heap 的用途跟特性都似懂非懂 ...
- 2Stack 與Heap 有何差別. 程式設計相關的行業 - Medium
- 3Day5 - 記憶體到底如何存放程式? - iT 邦幫忙
Stack 的用途,最主要是用來儲存函式的區域變數、甚至是Stack 的指標(比方說,ebp, esp, eip)(這些指標會在後續說明其用途),而Heap 則是用來儲存動態初始化的 ...
- 4stack vs heap:執行時期儲存兩大要角 - 劉逸的留意世界
當資訊為動態配置產生,系統會存放在另外一塊空間,稱之為『Heap』(注意這裡的Heap跟資料結構中的Heap不相關,可別會錯意!)。Heap的區塊專收執行期間動態 ...
- 5堆積- 維基百科,自由的百科全書 - Wikipedia
堆積(英語:Heap)是電腦科學中的一種特別的完全二元樹。若是滿足以下特性,即可稱為堆積:「給定堆積中任意節點P和C,若P是C的母節點,那麼P的值會小於等於(或大於 ...