我想知道数组的大小。我想到了size * sizeof(item) + sizeof(pointer)
但是分配了多少字节来引用数组?
问问题
673 次
1 回答
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 位执行它。
对于这个开销,您必须添加:数组的元素(so size * sizeof(element)
)加上至少一个对您需要拥有的数组的引用(so IntPtr.Size
)。
请注意,我注意到了一些不一致之处。如果我创建double[1]
单个双精度数组,它们中的每一个都在 8 字节边界上完美对齐,但使用的空间似乎只有 20 字节/数组(在 32 位,所以 12 + sizeof(double))。这显然是不可能的,因为 20 不能被 8 整除。我认为这GC.GetTotalMemory
是“忽略”对象之间的洞。这可能是一些字节/数组的额外开销(取决于数组元素的类型)。对于byte[1]
中等大小是 16 字节/数组(32 位,所以 12 + sizeof(byte) + 3)。这似乎更正确。
于 2013-08-31T17:56:09.213 回答