--- GA:G-BQ963DC1HL --- # [C#]Stack與Heap ## Stack 什麼是 Stack ? **Stack** 1.一種記憶體空間儲存程式執行中的資料 2.每次呼叫function就會在Stack產生 **Stack Frame** 3.每次function return **Stack Frame** 會馬上移除 4.儲存的資料為 **Value Type** **Stack Frame** 包含 Method parameters、Return address 、 Local variables ![1](https://hackmd.io/_uploads/Hk9nwbeoye.png) **StackOverflowException 情況** 因為是一直往上累加上去,如果呼叫的function超過Stack限制就會產生 **StackOverflowException** **Visual Studio 中查看 Stack** 偵錯時,在偵錯功能表中,選取視窗>呼叫堆疊,或按ctrl+alt+C 。 ![2](https://hackmd.io/_uploads/rkP6DZlsyx.png) ## Heap #### 什麼是 Heap ? **Heap** 1.一種記憶體空間儲存程式執行中的資料, 2.使用 `new` 關鍵字的物件產生 Heap 把該物件的資料儲存在這邊 ex. `MyClass obj = new MyClass();` 3.儲存的資料為 **Reference Type** **Stack 跟 Heap 的關係是 ?** 當呼叫的function傳入的參數值是 new 出來的物件類型時,所產生的 Stack Frame 裡的 Method parameters 實際上是指向 Heap 位置來找到該筆物件的資料 **使用 Heap 的缺點** 1.執行速度相對Stack會比較慢。因為會多要從Stock再到Heap裡找資料 2.function執行完後儲存在Heap的資料不會馬上移除,因為 Net Framework 會使用 Garbage Collection 的機制來移除 Heap 裡的資料,因為 clean Heap 會花費很多時間 ## 結論 > 1. 程式使用 Stack(Value Type) 儲存資料會比使用 Heap(Reference Type) 來的快 > 2. 程式使用 Stack 在function return 後會馬上移除暫存在Stack的資料,Heap 不會馬上移除會在執行 Garbage Collection 時做移除 ## 參考資料 1. [在偵錯工具中檢視呼叫堆疊和使用 [呼叫堆疊] 視窗](https://learn.microsoft.com/zh-tw/visualstudio/debugger/how-to-use-the-call-stack-window?view=vs-2022) ###### tags: `分享筆記` `C#`