6個重要的概念:棧,堆,值類型,引用類型,裝箱,拆箱

轉自:http://www.cnblogs.com/niyw/archive/2010/09/20/1832077.html

html

引言

  本篇文章主要介紹.NET中6個重要的概念:棧,堆,值類型,引用類型,裝箱,拆箱。文章開始介紹當你聲明一個變量時,編譯器內部發生了什麼,而後介紹兩個重要的概念:棧和堆;最後介紹值類型和引用類型,並說明一些有關它們的重要原理。函數

  最後經過一個簡單的示例代碼說明裝箱拆箱帶來的性能損耗。性能

 

聲明變量的內部機制

  在.NET程序中,當你聲明一個變量,將在內存中分配一塊內存。這塊內存分爲三部分:1,變量名;2,變量類型;3,變量值。學習

  下圖揭示了聲明一個變量時的內部機制,其中分配的內存類型依據你的變量類型。.NET中有兩種類型的內存:棧內存和堆內存。在接下來的內容中,咱們會了解到這兩種類型的詳細內容。spa

  

棧和堆

  爲了明白什麼是棧和堆,先讓咱們看下下面示例代碼的內部機制:翻譯

?
1
2
3
4
5
6
7
8
public void Method1(){
// Line 1
int i=4;
// Line 2
int y=2;
//Line 3
class1 cls1 = new class1();
}


這裏一共有3行代碼。讓咱們一下逐行看一下它們是如何執行的:指針

 

第1行:當這行代碼執行時,編譯器爲它分配一小塊棧內存。運行時棧負責提供程序所需的內存;code

第2行:程序繼續執行。如同名字同樣,棧在第一塊內存的頂部分配了一塊內存。你也能夠認爲是模塊或零件一塊一塊疊起來;htm

    內存的分配與釋放遵循後進先出(後進先出)邏輯,換句話說,內存只能在示例中i內存塊的頂部分配或釋放。對象

第3行:在第3行,咱們建立了一個對象。當該行執行時,編譯器在站上建立了一個指針,真實的對象存儲在另外一種叫「堆」的內存中。"堆"並不跟蹤運行內存,它更像一堆隨時能夠訪問的對象。堆用於動態分配內存。這裏須要着重說明的是引用指針是分配在棧上。聲明Class1 cls1時並不會給Class1的實例分配內存,而是分配一個棧變量cls1(並設置爲null),而後把它指向「堆」。

退出方法:當方法退出時,它釋放了棧上全部內存變量。換句話說,棧上全部的"Int"變量都依據後進先出的邏輯被釋放掉了。要注意,此時不會釋放堆內存,這種內存稍後會被「垃圾收集器」釋放。

如今可能會有不少朋友奇怪爲何要分配2種內存,而不是僅用一種內存。

  若是仔細觀察,你會發現基本類型並不複雜,他們值包含簡單的值,如i=0。對象數據類型很複雜,它們會引用其它對象或基本類型。換句話說,它要保持其它多種多樣的引用,而每種類型必須存在內存中。對象類型須要動態內存而基本類型須要靜態內存。若是須要分配動態內存,那麼就分配到堆上;反之在棧上。

值類型與引用類型

  如今咱們明白了棧和堆,接下來看值類型和引用類型。值類型的數據和內存在同一個位置,而引用類型是一個指向內存的指針。

  下面示例是一個整形數據類型變量i被賦給另外一個整形數據類型變量j。它們的內存值都分配在棧上。當咱們把一個int值分配給另一個int值時,須要建立一個徹底不一樣的拷貝。換句話說,你能夠改變其中任何一個而不會影響另一個。這種數據類型被稱爲值類型。  當咱們建立一個對象,並把一個對象賦給另一個對象時,它們的指針指向相同的內存(以下圖,當咱們把obj賦給obj1時,它們指向相同的內存)。換句話說,咱們改變其中一個,會影響到另一個,這種類型稱爲引用類型。

那麼那種類型是值類型和引用類型呢?

  在.NET中,依據數據類型,變量被分配到堆或棧上。「string」和"Object"是引用類型,其餘基本類型被分配到棧上,是值類型,以下圖:

裝箱與拆箱

  經過上面學習,咱們學到了不少有用的東西,其中最有用的是明白了當把數據從棧移動到堆上時會有性能損失。以下圖實例,當咱們把一個值類型裝箱爲引用類型時,數據從棧移動到堆上。反之,數據從堆移動到棧上。這種在堆和棧之間的移動帶來了性能的損失。數據從值類型轉變爲引用類型的過程稱爲「裝箱」,反之爲「拆箱」。

若是編譯上面的代碼,在ILDASM中看IL代碼就會發下如何進行裝箱拆箱操做的,以下:

裝箱拆箱的性能影響

  爲了揭示裝箱拆箱如何影響性能,咱們把下面代碼運行10000次。一個函數有裝箱操做,另外一個只有簡單代碼。咱們用簡單的計時器看它們的運行時間。裝箱函數耗時 3542 MS,無裝箱操做的耗時2477MS。這說明在實際項目中,除非必須,不然應避免裝箱,拆箱操做。

 

備註:

  最近在CodeProject上看到<6 important .NET concepts: - Stack, heap, Value types, reference types, boxing and Unboxing>一文,我的以爲很是好,因此就翻一下給不想看英文的同窗。因爲能力有限,翻譯的很差,望你們多多包涵。

相關文章
相關標籤/搜索