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

Her*_*ton 3 c# arrays

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

xan*_*tos 8

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

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)

这段代码是.NET阵列开销的修改版本吗?

显然你必须在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).这似乎更正确.