實值型別、參考型別在堆棧、託管堆中分配

來源:互聯網
上載者:User
C#中物件類型主要有兩種——參考型別(重量級對象)和實值型別(輕量級對象)。

  參考型別總是在堆中分配(除非使用 stackalloc 關鍵字),並給予一個額外的間接層;也即,它們需要通過對其儲存位置的引用來訪問。既然這些類型不能直接存取, 某個參考型別的變數總是儲存實際對象的引用(或 null ) 而不是對象本身。假設參考型別在堆中分配,運行時必須確保每個分配請求被正確執行。考慮下面代碼,它執行一次成功的分配:

Matrix m = new Matrix(100, 100);

  其幕後執行是:CLR記憶體管理器收到分配請求,它會計算儲存該對象包括頭部和類變數所需的記憶體數量。然後記憶體管理器檢查堆中可用空閑空間,以確認是否有足夠空間供這次分配。如果有,對象 所需空間會被成功分配並且對其儲存地址的引用也會被返回。如果沒有足夠空間儲存物件,垃圾收集器將被啟動去釋放一些空間並進行堆緊縮操作。

  如果執行成功,為了保持後續的垃圾收集操作,記憶體管理器將對象寫入記憶體前還必須採取另一個重要步驟。這一步驟涉及產生一塊稱作寫屏障(write barrier)的代碼(垃圾收集器的實現細節超出本文範圍)。相反地,每當有對象被寫入記憶體或 者當對象在記憶體中產生對另一個對象的引用(例如原先存在對象指向新建立對象),運行時便產生寫屏障。垃圾收集器功能實現的許多複雜性之一是要記住這些對象的存在 可寫性,因而在收集過程中它們不會被誤收集,雖然它們是被毫不相關的另一個對象所指向的對象。正如你可能會猜測,這些寫屏障招致小的運行時開銷,所以對於科學 計算應用來說,在運行過程中建立數百萬對象不是理想情境。

  實值型別被直接儲存在棧中(雖然此規則有例外,我馬上會講到)。實值型別不需要間接層,所以實值型別變數總儲存自身實際值而不能將引用儲存為其它類型(因而,它們也就不能為 null)。使用實值型別主要優點是它們的分配只產生很小的運行時開銷。分配它們時,只是簡單增加棧指標並且不需要被記憶體管理器管理。這些對象決不調用垃圾收集功能。此外,實值型別不產生寫屏障。

  C#中,單一資料型別(int,float,byte)、枚舉類型和結構(struct)類型都是實值型別。雖然前面我講過實值型別直接儲存在棧中,但我沒有使用“總是”,正如我論述參考型別時一樣。包含在參考型別內的實值型別不會被儲存在棧中,而是堆中,它被包含於參考型別對象中。例如,看看下面程式碼片段:

class Point
{
private double x, y;

public Point (double x, double y)
{
this.x = x;
this.y = y;
}
}

  這個類的一個執行個體佔用24位元組,其中8位元組用於對象頭,剩餘16位元組用於兩個雙精確度變數x和y。與此同時,參考型別是包含在實值型別對象中的(例如,結構中包含數組) ,它不會導致整個對象在堆中分配。只有數組在堆中分配,對該數組的引用被置於在棧中存放的結構中。

  實值型別派生於 System.ValueType,它本身又派生於 System.Object。因為這個,實值型別具備像類一樣的特徵。實值型別有建構函式(除了無參數建構函式)、索引指標(indexer)、方法和重載運算子,它們也能實現介面。然而,它們不能被繼承,也不能從其 它類型繼承。這些對象容易成為 JIT 最佳化因素,因為它們產生有效、高效能代碼。

  這裡有一個警告:極其容易意外地將實值型別設陷為一個對象,從而導致在堆中分配它——眾所周知,這就是裝箱(boxing)技術。確信你的代碼 不會進行在不必要的值裝箱操作,否則將失去最初得到的效能。另一個警告是:實值型別數組(例如雙精確度或整型數組)是在堆中存放,而不是棧中。只有儲存數組引用的值是存放在棧中。這是因為所有數群組類型都隱含派生於System.Array,它們都是參考型別。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.