【问题标题】:Which size does an array have in memory? [duplicate]数组在内存中的大小是多少? [复制]
【发布时间】:2013-09-04 05:21:51
【问题描述】:

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

【问题讨论】:

  • 使用垃圾收集类 System.GC ,并根据您的需要对其进行测试
  • 请注意,可悲的是,我链接的另一个问题并未提及 x64 位。周日我会尝试做一些实验。
  • 做了一些实验...在 64 位时,数组的开销为:值类型数组为 24 位,引用类型数组为 32 位。

标签: c# arrays


【解决方案1】:

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

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],那么单个双精度数组,它们中的每一个都在 8 字节边界上完全对齐,但使用的空间似乎只有 20 字节/数组(在 32 位,所以 12 + sizeof(double ))。这显然是不可能的,因为 20 不能被 8 整除。我认为 GC.GetTotalMemory 是“忽略”对象之间的洞。这可能是一些字节/数组的额外开销(取决于数组元素的类型)。对于byte[1],中等大小是 16 字节/数组(32 位,所以 12 + sizeof(byte) + 3)。这似乎更正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多