我想知道数组的大小。我想到size * sizeof(item) + sizeof(pointer)
但是为了能够引用数组而分配了多少字节?
答案 0 :(得分: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);
}
}
此代码是此处Overhead of a .NET array?
的修改版本显然你必须在32位和64位执行它。
要达到这个开销,你必须添加:数组的元素(所以size * sizeof(element)
)加上至少一个你需要拥有的数组的引用(所以IntPtr.Size
)。
请注意,我注意到有一些不一致之处。如果我创建double[1]
,那么一个double的数组,每个都在8字节边界上完全对齐,但是使用的空间似乎只有20个字节/数组(32位,所以12 + sizeof (双))。这显然是不可能的,因为20不能被8整除。我认为GC.GetTotalMemory
是“忽略”对象之间的洞。这可能是某些字节/数组的额外开销(取决于数组元素的类型)。对于byte[1]
,中等大小是16字节/数组(32位,所以12 + sizeof(字节)+ 3)。这似乎更正确。