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