這是經典的概念題。要寫出能動的程式很簡單, 要去解釋背後的記憶體管理運用原則, 還是需要一點時間內化。而且不知道為什麼, 一般的軟體工程師跟架構師來說這兩個詞, 那個講起來那個味道就是不太一樣, 有時候面談別人時, 還會覺得有些求職者有獨到的見解。 簡單來說, 從記憶體配置的角度, 用一個二分法 stack 用於靜態記憶體配置, 大陸翻譯為棧, 棧, 棧 (why ?) heap 用於動態記憶體配置, 大陸翻譯為堆 抱怨一下, 堆跟棧我一直覺得命名混亂, 用 Google 翻譯也會發現 stack 跟 heap 都翻譯為堆疊的「堆」, 連 Google 都搞錯了, 所以後面還是用英文來說吧。 這張 All-in-one 的圖是我目前最喜歡的圖像解釋, 來源是 Six important .NET concepts: Stack, heap, value types, reference types, boxing, and unboxing : 首先記得這個範例, 圖片是由上而下逐行介紹, public void Method1() { int i = 4; //Line1 int y = 2; //Line2 Class1 cls1 = new Class1(); //Line3 } 總結是 : value type 的變數, 包括指標變數會放在 stack reference type 的變數 (如 string, object) 本身也會放 stack, 然而他的值 (value) 則是放 heap boxing 就是 value types to reference types 的過程, 所以 value 會被放到 heap 中, 而產生一個 object 變數來指向這個 value, 變數指標則是在 stack unboxing 是 reference types to value types 的過程, 所以原本 object 所指向的值 (heap 中) 會被複製到 stack 中並賦予明確 value type 型別 深入 Stack 現在回到最原點, 我們略懂 stack 與 heap 的區別了, 但還是沒有一個「感覺」對不對 ? 因為我們不懂 why。我個人建議有
劍心 ~紀念軟體開發 10+ 年~ ~紀念寶寶 元 年~