C#--棧和堆

什麼是棧和堆

棧:全稱是線程堆棧,英文 Stack;棧空間比較小,但是讀取速度快。
堆:全稱是託管堆,英文Heap;堆空間比較大,但是讀取速度慢。

解釋1:
棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。

解釋2:
存放在棧中時要管確定存儲順序,保持着先進後出的原則,它是一片連續的內存域,由系統自動分配和維護。而堆是無序的,它是一片不連續的內存域,由有用戶自己來控制和釋放,如果用戶自己不釋放的話,當內存達到一定的特定值時,系統將會通過垃圾回收器(GC)來回收。

棧和堆的區別

1.

     棧的特徵:先進後出。

     數據只能從棧的頂端插入和刪除,把數據放入棧頂稱爲入棧(push),從棧頂刪除數據稱爲出棧(pop)。

2.堆

    堆是一塊內存區域,與棧不同,堆裏的內存能夠以任意順序存入和移除。

3.值類型和引用類型 

  C#中類型被分爲兩種:值類型(整數,小數,bool,struct,char )和引用類型(string,數組,自定義的類,內置的類)。

  1)值類型只需要一段單獨的內存,用於存儲實際的數據。

  2)引用類型需要兩段內存。第一段存儲實際的數據,它總是位於堆中,第二段是一個引用,指向數據在堆中的存放位置。

即:C#中值類型的值存在棧上;引用類型的值存在堆上,棧上存引用。將一個值類型變量賦值給另一個值類型變量時,將賦值包含的值。而引用類型變量的賦值只複製對象的引用,而不復制對象本身。值類型就是現金,要用直接用;引用類型是存摺,要用還得先去銀行取現。

棧通常保存着我們代碼執行的步驟,而堆上存放的則多是對象,數據等。我們可以把棧想象成一個接着一個疊放在一起的盒子。當我們使用的時候,每次從最頂部取走一個盒子。當一個方法(或類型)被調用完成的時候,就從棧頂取走,接着是下一個。堆則不然,它像是一個倉庫,儲存着我們使用的各種對象等信息,而且它們被調用完畢不會立即被清理掉。棧內存無需我們管理,也不受GC管理。當棧頂元素使用完畢,立馬釋放。而堆則需要GC(Garbage collection:垃圾收集器)清理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章