Global全域 Stack堆疊 Heap堆積 |
這一篇來和大家介紹一下C#的程式觀念,有關於記憶體空間,分成了三種-global、stack、heap。
Global全域:
存放
全域變數(global variable)
靜態變數(static variable)
程式編譯時會優先配置global的記憶體,因為優先配置的特性,使用global可以提升程式的效率,但是global沒有存活周期,程式啟動時就會佔用記憶體,一直到程式結束才釋出記憶體,因此使用global會造成容易耗用記憶體的問題。
Stack堆疊:
靜態記憶體配置,這是可預測的記憶體配置方式。
存放值型別(value type)資料
區域變數(local variable)
函式參數(function/method parameter)
函式的位址(function/method return address)
Stack是採用先進後出,最先進去的最後出來,最後進去的反而第一個出來,最後才宣告的變數會先被回收釋放出記憶體空間,先宣告的變數會之後才被回收。由於Stack的生命週期是規律的,可以知道甚麼時候就不會在使用了,因此系統在生命週期結束以後就會自動回收釋放出記憶體。
Heap堆積:
動態記憶體配置,存放參考型別(Reference type)資料,動態記憶體配置是一種無法預測的記憶體配置方式,一開始並不知道記憶體大小,由使用者給定大小,例如陣列。
在C#和JAVA中都有垃圾回收機制(garbage collection),這個機制會自動回收沒有用到的資料而釋放記憶體空間。那如果是在C/C++是要自己手動釋放記憶體。
有關於垃圾回收機制是甚麼,想要更深入了解的人可以看下面這篇文章:
最後,給大家一個Stack和Heap的記憶體配置示意圖如下:
高位址 |
Stack
|
|||
低位址 |
Heap |
Stack的記憶體位址配置是從高到低,而Heap的記憶體位址配置是從低到高。
網路上對於記憶體區間的觀念有很多文章,而我找到下面這篇是我看到介紹Stack和Heap記憶體配置寫最好的一篇,給大家參考
留言列表