自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析C#編程中的內(nèi)存管理

開發(fā) 后端
C#編程的一個優(yōu)點是程序員不需要關心具體的內(nèi)存管理,尤其是垃圾收集器會處理所有的內(nèi)存清理工作。雖然不必手工管理內(nèi)存,但如果要編寫高質(zhì)量的代碼,還是要理解后臺發(fā)生的事情,理解C#的內(nèi)存管理。本文主要介紹給變量分配內(nèi)存時計算機內(nèi)存中發(fā)生的情況。

C#編程的一個優(yōu)點是程序員不需要關心具體的內(nèi)存管理,尤其是垃圾收集器會處理所有的內(nèi)存清理工作。雖然不必手工管理內(nèi)存,但如果要編寫高質(zhì)量的代碼,還是要理解后臺發(fā)生的事情,理解C#的內(nèi)存管理。本文主要介紹給變量分配內(nèi)存時計算機內(nèi)存中發(fā)生的情況。

C#將數(shù)據(jù)分為兩種:值數(shù)據(jù)類型和引用數(shù)據(jù)類型,這兩種數(shù)據(jù)類型存儲在內(nèi)存中的不同的地方:值數(shù)據(jù)類型存儲在堆棧中,而引用類型存儲在內(nèi)存的托管堆中。

一、內(nèi)存簡介

Windows使用一個系統(tǒng):虛擬尋址系統(tǒng)。這個系統(tǒng)的作用是將程序可用的內(nèi)存地址映射到硬件內(nèi)存中的實際地址上。其實際結果就是32位的機子上每個進程都可以使用4GB的內(nèi)存,當然,64位機這個數(shù)字就大了去了。這4GB的內(nèi)存實際上包含了程序的所有的部分:可執(zhí)行代碼,DLL以及程序運行時使用的所有變量的內(nèi)容。這個4GB的內(nèi)存成為虛擬地址空間或虛擬內(nèi)存。為方便,這里成為內(nèi)存。

4GB中的每個存儲單元都是從零開始向上存儲的。要訪問存儲在內(nèi)存中的某個空間中的值,就必須提供表示該存儲單元的一個數(shù)字。在高級編程語言中,編譯器的一個重要作用就是負責將人們可以理解的變量名稱變?yōu)樘幚砥骺梢岳斫獾膬?nèi)存地址。

二、堆棧

在內(nèi)存中,有一個區(qū)域成為堆棧,存儲對象

對象成員的值數(shù)據(jù)類型調(diào)用方法時,傳遞給所有方法的參數(shù)的副本注意:調(diào)用方法時,堆棧存儲的是所有參數(shù)的副本,因此,經(jīng)值類型A傳遞給函數(shù),A的值是不會變化的。當然,引用類型是會變化的,因為在堆棧中存儲的是引用類型的地址,這在后面會有詳細的介紹。

下面以一個例子來說明堆棧的工作方式,如下面的代碼:

1: { 

2: int a; 

3: //do something; 

4: { 

5: int b; 

6: //do something 

7: } 

8: }  

首先聲明a,在內(nèi)部的代碼塊中聲明b,然后內(nèi)部的代碼塊終止,b就出了作用域,最后a出作用域。所以b的生命周期總是包含在a的生命周期內(nèi),在釋放變量的時候,其順序總是和分配內(nèi)存的順序是相反的。即:變量的生存周期都是嵌套的。這就是堆棧的工作方式。

三、托管堆

堆棧具有相當高的性能,但是變量的生命周期必須是嵌套的,這個要求在有的時候過于苛刻。我們希望有一種別的方法來分配內(nèi)存,存儲一些數(shù)據(jù),并在方法退出的很長一段時間內(nèi),這些數(shù)據(jù)仍然是可用的,這時,就使用托管堆。

托管堆(簡稱堆)是內(nèi)存中的另外一個區(qū)域,我們?nèi)匀挥靡粋€例子來說明堆的工作方式,如下面代碼:

1: {

2: Customer customer1;

3: customer1=new Customer();

4: Customer customer2=new Customer();

5: //do something

6: } 

首先,聲明一個Customer:customer1,在堆棧上給這個引用分配存儲控件。請注意:僅僅是給這個引用分配存儲空間,并不是實際的Customer對象。customer1占用4個字節(jié)的空間(32位機),來表示Customer對象在內(nèi)存中的地址。

然后,執(zhí)行第二行代碼,完成以下操作:

在堆上分配存儲空間,用來存儲Customer對象,注意:這里是Customer對像。

將變量customer1的值設為分配給Customer對象的內(nèi)存地址從這個例子中可以看出,建立引用類型的變量的過程要比獎勵值類型變量的過程復雜,且不避免的有性能的降低。但是,我們可以將一個引用變量的值賦給另一個引用變量,當一個變量出作用域時,它會從堆棧中刪除,但是對象的數(shù)據(jù)仍然保留在內(nèi)存中,知道程序停止。

這樣,我們在將一個引用變量A傳遞給函數(shù)時,僅僅是將變量A的引用傳遞給了函數(shù),即:僅僅是在堆棧上分配內(nèi)存,即變量B兩者指向同一個內(nèi)存地址。因此,當變量B發(fā)生變化時,變量A也會發(fā)生變化。

四、裝箱和拆箱

裝箱和拆箱就是值類型和引用類型的項目轉(zhuǎn)化,裝箱可以將值類型轉(zhuǎn)化為引用類型,拆箱的作用正好相反,經(jīng)引用類型轉(zhuǎn)化為值類型。

五、垃圾收集

一般情況下。NET運行庫會在認為需要的時候運行垃圾收集器來釋放托管資源,這在大多數(shù)情況下,足夠了。就是說我們沒有必要去關心內(nèi)存。但在有的情況下,我們會強制垃圾回收集器在代碼的某個地方運行,釋放內(nèi)存。這就用到了System.GC.Collect()。System.GC表示一個垃圾收集器。這種情況很少,例如:代碼中大量的對象剛剛停止引用,就適合調(diào)用垃圾收集器。

【編輯推薦】

  1. 跟MVP學C#視頻教程之一 .NET與C#語言
  2. C#多線程編程實例
  3. C# 4.0中的動態(tài)類型與編程技巧
責任編輯:田超 來源: 中國IT實驗室收集整理
相關推薦

2009-03-10 13:59:41

C#套接字編程

2009-08-27 14:12:02

C# interfac

2009-09-17 16:41:12

C#組件編程

2009-08-20 10:25:37

C#操作內(nèi)存

2009-08-20 10:53:23

C#操作內(nèi)存

2009-08-20 17:30:56

C#異步編程模式

2009-08-25 15:52:27

C#工具欄

2009-08-20 17:47:54

C#異步編程模式

2009-08-20 11:07:07

C#共享內(nèi)存

2009-08-31 17:02:28

C#接口編程

2009-08-21 14:03:04

C#網(wǎng)絡編程

2009-04-29 09:06:18

C#設計模式Adapter

2009-07-31 18:39:31

C#中foreach引

2009-09-03 16:58:49

C#內(nèi)存管理

2009-08-21 14:47:39

C#網(wǎng)絡編程

2009-08-21 17:19:36

C#網(wǎng)絡編程入門

2009-08-14 17:45:52

C# ArrayLis

2009-08-17 18:34:50

C# ChangeCo

2009-08-07 17:25:37

C# SortedLi

2009-09-08 16:22:27

c# listBox
點贊
收藏

51CTO技術棧公眾號