2013-08-31 46 views
3

我想知道數組的大小。我想到了size * sizeof(item) + sizeof(pointer),但是爲了引用數組而分配了多少字節?數組的大小是否在內存中?

+0

使用垃圾收集類System.GC,並測試它的任何你想要的 –

+0

請注意,可悲的是,我已經鏈接的其他問題並不涉及x64位。星期天我會嘗試做一些實驗。 – xanatos

+1

做了一些實驗...在64位數組的開銷是:24位值型數組和32位參考型數組。 – xanatos

回答

8

字節數組的開銷是:

Architecture | Value Type Array | Reference Type Array 
    x86    12     16 
    x64    24     32 

您可以

using System; 

class Test 
{ 
    const int Size = 100000; 

    static void Main() 
    { 
     Console.WriteLine("Running at {0} bits", IntPtr.Size * 8); 

     Tester<string>(); 
     Tester<double>(); 

     Console.ReadKey(); 
    } 

    static void Tester<T>() 
    { 
     var array = new object[Size]; 
     long initialMemory = GC.GetTotalMemory(true); 

     for (int i = 0; i < Size; i++) 
     { 
      array[i] = new T[0]; 
     } 

     long finalMemory = GC.GetTotalMemory(true); 

     GC.KeepAlive(array); 

     long total = finalMemory - initialMemory; 

     Console.WriteLine("Size of each {0}[]: {1:0.000} bytes", typeof(T).Name, 
          ((double)total)/Size); 
    } 
} 

此代碼calc下這些值是一個修改後的版本從這裏Overhead of a .NET array?

顯然你必須在32位和64位執行它。

對於這個開銷,你必須添加:數組的元素(所以size * sizeof(element))加上至少一個你需要的數組引用(所以IntPtr.Size)。

請注意,我注意到了一些不一致之處。如果我創建了double[1],那麼所以使用單個double的數組,每個數組都在8字節邊界上完美對齊,但所用空間似乎只有20個字節/數組(32位,因此12 + sizeof(double)) 。這顯然是不可能的,因爲20不能被8整除。我認爲GC.GetTotalMemory是「忽略」物體之間的洞。這可能是一些字節/數組的額外開銷(取決於數組元素的類型)。對於byte[1],中等大小是16字節/數組(32位,所以12 + sizeof(byte)+ 3)。這似乎更加正確。

相關問題