我想知道阵列的大小.我想到size * sizeof(item) + sizeof(pointer)但是为了能够引用数组而分配了多少字节?
以字节为单位的数组开销是:
Architecture | Value Type Array | Reference Type Array
x86 12 16
x64 24 32
Run Code Online (Sandbox Code Playgroud)
您可以使用计算这些值
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);
}
}
Run Code Online (Sandbox Code Playgroud)
显然你必须在32位和64位执行它.
对于这个开销,你必须添加:数组的元素(so size * sizeof(element))以及至少对你需要拥有的数组的引用(so IntPtr.Size).
请注意,我注意到存在一些不一致之处.如果我创建double[1],那么一个double的数组,每个都在8字节边界上完全对齐,但是使用的空间似乎只有20个字节/数组(32位,所以12 + sizeof(double)).这显然是不可能的,因为20不能被8整除.我认为它GC.GetTotalMemory是"忽略"物体之间的洞.这可能是某些字节/数组的额外开销(取决于数组元素的类型).对于byte[1]中等大小是16字节/阵列(32位,所以12 + sizeof(字节)+ 3).这似乎更正确.