理解堆與棧導(dǎo)航
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第一節(jié) 理解堆與棧深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第二節(jié) 棧基本工作原理深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第三節(jié) 棧與堆,值類(lèi)型與引用類(lèi)型深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第四節(jié) 參數(shù)傳遞對(duì)堆棧的影響 1深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第四節(jié) 參數(shù)傳遞對(duì)堆棧的影響 2
前言雖然在.Net Framework 中我們不必考慮內(nèi)在管理和垃圾回收(GC),但是為了優(yōu)化應(yīng)用程序性能我們始終需要了解內(nèi)存管理和垃圾回收(GC)。另外,了解內(nèi)存管理可以幫助我們理解在每一個(gè)程序中定義的每一個(gè)變量是怎樣工作的。
簡(jiǎn)介這篇文章會(huì)包含堆與棧的基礎(chǔ)知識(shí),變量類(lèi)型,變量工作原理。 在程序運(yùn)行時(shí),.NET FRAMEWORK把對(duì)象存儲(chǔ)在內(nèi)存中的兩個(gè)位置:堆與棧,并且它們都會(huì)幫助我們更好的運(yùn)行程序。堆與棧寄存在電腦的操作內(nèi)存中,并包含我們需要的信息使整個(gè)程序運(yùn)行正常。
堆與棧:有什么不同?棧,或多或少負(fù)責(zé)跟蹤正在程序中運(yùn)行的代碼。
堆,或多或少負(fù)責(zé)跟蹤程序?qū)ο蠡驍?shù)據(jù)。
棧,把它想像成疊在一起的盒子(像搭積木一樣)。每一次調(diào)用一個(gè)方法就會(huì)在最上面疊一個(gè)盒子,用來(lái)跟蹤程序運(yùn)行情況。我們只能使用棧中疊在最上面的盒子里的東西。當(dāng)某一最上面的盒子里的代碼執(zhí)行完畢(如方法執(zhí)行完成),就把它扔掉并繼續(xù)去使用下一個(gè)盒子。
堆,與棧類(lèi)似,只是它是用來(lái)保存信息而不是跟蹤執(zhí)行。所以,堆里的任何信息都可以在任何時(shí)間被訪問(wèn)。有了堆,訪問(wèn)信息沒(méi)有約束,而不像棧只能訪問(wèn)最上面的盒子。
堆的情況就像你把一堆剛洗完的衣服放在床上還沒(méi)有時(shí)間來(lái)的及收走,你可以迅速拿到你想要拿的衣服。棧的情況就像你疊在一起的鞋盒子,你需要拿走最上面的盒子才能拿到下一個(gè)盒子。
上圖并不上真正的內(nèi)存運(yùn)行情況,只是為了讓大家區(qū)分堆和棧。
棧,會(huì)自我管理,它有自己的內(nèi)存管理機(jī)制。當(dāng)最上面的盒子不再使用時(shí),會(huì)自動(dòng)被扔掉。
堆,相反,我們要控制它的垃圾回收(GC)。我們要去管理堆是否干凈,就像管理床上的臟衣服。你不手動(dòng)扔掉它,就會(huì)在床上變臭。
什么在堆和棧里當(dāng)程序執(zhí)行時(shí),我們主要有4種類(lèi)型的東西放進(jìn)堆和棧里:值類(lèi)型,引用類(lèi)型,指針,指令。
值類(lèi)型:
它們都衍生于System.ValueType。
引用類(lèi)型:
它們都衍生于System.Object。當(dāng)然object就是System.Object。
指針:第三種被放于內(nèi)存管理體制中的是類(lèi)型的引用。這個(gè)引用通常被叫作指針。我們并不具體的使用指針,它們由CLR管理。一個(gè)指針(引用)是不同于引用類(lèi)型的。我們定義它是一個(gè)引用類(lèi)型,意味著我們可以通過(guò)指針訪問(wèn)它。一個(gè)指針占有一小塊內(nèi)存,這塊內(nèi)存指向另一塊內(nèi)存。指針占用在內(nèi)存中的存儲(chǔ)和其它的相同,只是存放的值既不是內(nèi)存地址也不是空null。
指令:我們會(huì)在后面的文章中介紹指令怎么工作。
總結(jié) |
|
來(lái)自: kiki的號(hào) > 《堆棧stack 托管堆heap》