数组在内存中的大小是多少?

我想知道arrays的大小。 我想到size * sizeof(item) + sizeof(pointer)但是为了能够引用数组而分配了多少字节?

以字节为单位的数组开销是:

 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(); Tester(); Console.ReadKey(); } static void Tester() { 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); } } 

这段代码是.NETarrays开销的修改版本吗?

显然,你必须在32位和64位执行它。

对于这个开销,你必须添加:数组的元素(所以size * sizeof(element) )加上至少对你需要拥有的数组的引用(所以IntPtr.Size )。

请注意,我注意到存在一些不一致之处。 如果我创建double[1] ,那么单个double的数组,每个都在8字节边界上完全对齐,但是使用的空间似乎只有20个字节/数组(32位,所以12 + sizeof(双))。 这显然是不可能的,因为20不能被8整除。我认为GC.GetTotalMemory “忽略”对象之间的洞。 这可能是某些字节/数组的额外开销(取决于数组元素的类型)。 对于byte[1] ,中等大小是16字节/arrays(32位,所以12 + sizeof(字节)+ 3)。 这似乎更正确。