什麼是棧和堆
棧:全稱是線程堆棧,英文 Stack;棧空間比較小,但是讀取速度快。
堆:全稱是託管堆,英文Heap;堆空間比較大,但是讀取速度慢。
解釋1:
棧是編譯期間就分配好的內存空間,因此你的代碼中必須就棧的大小有明確的定義;
堆是程序運行期間動態分配的內存空間,你可以根據程序的運行情況確定要分配的堆內存的大小。
解釋2:
存放在棧中時要管確定存儲順序,保持着先進後出的原則,它是一片連續的內存域,由系統自動分配和維護。而堆是無序的,它是一片不連續的內存域,由有用戶自己來控制和釋放,如果用戶自己不釋放的話,當內存達到一定的特定值時,系統將會通過垃圾回收器(GC)來回收。
棧和堆的區別
1.棧
棧的特徵:先進後出。
數據只能從棧的頂端插入和刪除,把數據放入棧頂稱爲入棧(push),從棧頂刪除數據稱爲出棧(pop)。
2.堆
堆是一塊內存區域,與棧不同,堆裏的內存能夠以任意順序存入和移除。
3.值類型和引用類型
C#中類型被分爲兩種:值類型(整數,小數,bool,struct,char )和引用類型(string,數組,自定義的類,內置的類)。
1)值類型只需要一段單獨的內存,用於存儲實際的數據。
2)引用類型需要兩段內存。第一段存儲實際的數據,它總是位於堆中,第二段是一個引用,指向數據在堆中的存放位置。
即:C#中值類型的值存在棧上;引用類型的值存在堆上,棧上存引用。將一個值類型變量賦值給另一個值類型變量時,將賦值包含的值。而引用類型變量的賦值只複製對象的引用,而不復制對象本身。值類型就是現金,要用直接用;引用類型是存摺,要用還得先去銀行取現。
棧通常保存着我們代碼執行的步驟,而堆上存放的則多是對象,數據等。我們可以把棧想象成一個接着一個疊放在一起的盒子。當我們使用的時候,每次從最頂部取走一個盒子。當一個方法(或類型)被調用完成的時候,就從棧頂取走,接着是下一個。堆則不然,它像是一個倉庫,儲存着我們使用的各種對象等信息,而且它們被調用完畢不會立即被清理掉。棧內存無需我們管理,也不受GC管理。當棧頂元素使用完畢,立馬釋放。而堆則需要GC(Garbage collection:垃圾收集器)清理。