Global全域

Stack堆疊

Heap堆積

 

這一篇來和大家介紹一下C#的程式觀念,有關於記憶體空間,分成了三種-globalstackheap

 

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++是要自己手動釋放記憶體。

有關於垃圾回收機制是甚麼,想要更深入了解的人可以看下面這篇文章:

 

 

最後,給大家一個StackHeap的記憶體配置示意圖如下:

高位址

Stack

                

 

 

 

 

低位址

 

 

 
 


 

               

Heap

 

 

Stack的記憶體位址配置是從高到低,而Heap的記憶體位址配置是從低到高。

 

網路上對於記憶體區間的觀念有很多文章,而我找到下面這篇是我看到介紹Stack和Heap記憶體配置寫最好的一篇,給大家參考

C#未分類菜單-『實值型別與參考型別的記憶體配置』

arrow
arrow
    全站熱搜

    波羅、希夏普2020 發表在 痞客邦 留言(0) 人氣()