[探索5 分鐘] stack 與heap 的底層概念

文章推薦指數: 80 %
投票人數:10人

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 usingnamespacestd; intmain(intargc,char*argv[],char*envp[]) { inti=1; foo(i,argc); cout<



請為這篇文章評分?