2010-08-26 77 views
4

假設我們先前已經實例化了來自D類 的三個對象A,B,C,現在一個數組定義如下: D [] arr = new D [3]; arr [0] = A; arr [1] = B; arr [2] = C;c#中對象的內存數組消耗多少?

數組是否包含對對象的引用或具有單獨的副本?

+1

引用,因爲它們是對象。 – 2010-08-26 07:35:30

+0

我打敗你了馬特;-) – 2010-08-26 07:36:25

回答

2

C#區分參考類型值類型

A 參考類型使用詞聲明。這些類型的變量包含引用,所以數組將是對象的引用數組。每個引用是4個字節(在32位系統上)或8個字節(在64位系統上)很大。

A 值類型使用結構聲明。每次分配時都會複製此類型的值。值類型的數組包含值的副本,所以數組的大小是結構乘以元素數量的大小。

通常當我們說「對象」時,我們引用引用類型的實例,所以您的問題的答案是「是」,但請記住差異並確保您不會意外創建大一個大結構數組。

0

該數組由指向對象的指針(32位或64位)組成。一個對象是一個引用類型,只有值類型被複制到數組本身。

5

一個引用類型數組只包含引用。

32位應用程序引用是32位(4字節),64位應用程序引用是64位(8字節)。因此,您可以通過將數組長度乘以參考大小來計算近似大小。 (陣列類的內部變量還有一些額外的字節,並且一些額外的字節用於內存管理。)

0

由於@ Yves表示它具有對象的引用。該陣列與C中一樣是一塊內存塊。 所以它的大小是sizeof(element)* count + oop所需的內存量。

2

您可以使用WinDBG + SOS(或PSSCOR2)查看陣列佔用的內存。 IIRC,一系列參考類型在存儲器中以其長度表示,隨後參考其元素,即它的確切尺寸是PLATFORM_POINTER_SIZE * (array.Length + 1)