【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈
理解堆與棧
導航
?
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第一節 理解堆與棧
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第二節 棧基本工作原理
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第三節 棧與堆,值類型與引用類型
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第四節 參數傳遞對堆棧的影響 1
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第四節 參數傳遞對堆棧的影響 2
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第五節 引用類型復制問題及用克隆接口ICloneable修復
深入淺出圖解C#堆與棧 C# Heap(ing) VS Stack(ing) 第六節 理解垃圾回收GC,提搞程序性能
?
?
前言
?
雖然在.Net Framework 中我們不必考慮內在管理和垃圾回收(GC),但是為了優化應用程序性能我們始終需要了解內存管理和垃圾回收(GC)。另外,了解內存管理可以幫助我們理解在每一個程序中定義的每一個變量是怎樣工作的。
?
?
簡介
這篇文章會包含堆與棧的基礎知識,變量類型,變量工作原理。
在程序運行時,.NET FRAMEWORK把對象存儲在內存中的兩個位置:堆與棧,并且它們都會幫助我們更好的運行程序。堆與棧寄存在電腦的操作內存中,并包含我們需要的信息使整個程序運行正常。
?
堆與棧:有什么不同?
?
棧,或多或少負責跟蹤正在程序中運行的代碼。
堆,或多或少負責跟蹤程序對象或數據。
?
棧,把它想像成疊在一起的盒子(像搭積木一樣)。每一次調用一個方法就會在最上面疊一個盒子,用來跟蹤程序運行情況。我們只能使用棧中疊在最上面的盒子里的東西。當某一最上面的盒子里的代碼執行完畢(如方法執行完成),就把它扔掉并繼續去使用下一個盒子。
堆,與棧類似,只是它是用來保存信息而不是跟蹤執行。所以,堆里的任何信息都可以在任何時間被訪問。有了堆,訪問信息沒有約束,而不像棧只能訪問最上面的盒子。
堆的情況就像你把一堆剛洗完的衣服放在床上還沒有時間來的及收走,你可以迅速拿到你想要拿的衣服。棧的情況就像你疊在一起的鞋盒子,你需要拿走最上面的盒子才能拿到下一個盒子。
?
?
上圖并不上真正的內存運行情況,只是為了讓大家區分堆和棧。
棧,會自我管理,它有自己的內存管理機制。當最上面的盒子不再使用時,會自動被扔掉。
堆,相反,我們要控制它的垃圾回收(GC)。我們要去管理堆是否干凈,就像管理床上的臟衣服。你不手動扔掉它,就會在床上變臭。
?
什么在堆和棧里
?
當程序執行時,我們主要有4種類型的東西放進堆和棧里:值類型,引用類型,指針,指令。
?
值類型:
- bool
- byte
- char
- decimal
- double
- enum
- float
- int
- long
- sbyte
- short
- struct
- uint
- ulong
- ushort
它們都衍生于System.ValueType。
?
引用類型:
- class
- interface
- delegate
- object
- string
它們都衍生于System.Object。當然object就是System.Object。
?
?
指針:
?
第三種被放于內存管理體制中的是類型的引用。這個引用通常被叫作指針。我們并不具體的使用指針,它們由CLR管理。一個指針(引用)是不同于引用類型的。我們定義它是一個引用類型,意味著我們可以通過指針訪問它。一個指針占有一小塊內存,這塊內存指向另一塊內存。指針占用在內存中的存儲和其它的相同,只是存放的值既不是內存地址也不是空null。
?
?
?
指令:
?
我們會在后面的文章中介紹指令怎么工作。
?
?
?
總結
?
第一節到此結束,以后的章節里會介紹不同對象在堆和棧里存放的不同。
?
翻譯于:?http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx
總結
以上是生活随笔為你收集整理的【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全国铁路6月20日大调图:北京至重庆缩短
- 下一篇: 中国独占!Intel Arc A380桌