程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .NET中的堆(Heap)和棧(Stack)的本質

.NET中的堆(Heap)和棧(Stack)的本質

編輯:關於.NET

計算機的內存可以分為代碼塊內存,Stack內存和Heap內存。代碼塊內存是在加載程序時存放程序機器代碼的地方。

棧(Stack)一般存放函數內的局部變量。

堆(Heap)一般存放全局變量和類對象實例等。

若只是聲明一個對象,則先在棧內存中為其分配地址空間,若再實例化它,則在堆內存中為其分配空間。

1、Stack VS Heap

     由於計算機的內存分配過程比較抽象,下面舉一個簡單的程序片段,來圖解和諧步驟對Stack和Heap內存的影響:

下面的StackVsHeap類有一個Person類和Fun1方法,當調用Fun1方法時,

     當執行第一句語句,即:

int i=3;

在.net中,除了string、object、class、delegate、interface外,其他的類型為數值類型。一般(不是全部)存放在Stack內存中。

此處 int i=3; 是函數內的非靜態變量,而數值類型為非引用類型,即會在Stack內存中分配一塊區域來存放該變量的名和值。

     當執行第二句語句,即:

int j=i;

.net也會在Stack內存中分配一個區域來存放該變量的名和值。而且地址塊在 i=3 上面(LIFO)。

解釋:

     ① FIFO(全稱:First in,First out):先進先出。

     ② LIFO(全稱:Last in,First out):後進先出。

     當執行第三句語句,即:

Person p = new Person();

時,我們可以分為兩步來看:

     1) 在Stack上分配一個Person類型的p引用變量(指針)(指向Heap上的地址);

     2)  在Heap上分配一個控件來存儲Person類的實例數據;

具體的過程如下圖所示:

2、值類型和引用類型

理解了上面的過程,現在理解值類型和引用類型的變量則更加容易:

     先看下面的圖:

由於 int j=i; 中是int類型,為值類型變量,則 j=3 為 i=3 的拷貝;因此,修改 i 不會修改 j,修改 j 也不會修改 i;

而 Person p2=p 中Person類,是引用類型,因此p2和p指向同一個Heap地址塊;因此,修改p2的值就會影響p的值。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved