C#原始类型别名的结构开销?

时间:2014-09-11 21:17:38

标签: c# memory types primitive-types overhead

我注意到C#中的原始类型实际上只是作为System命名空间中定义的结构的别名实现的,例如ulongSystem.UInt64的别名,struct类型。 C#中的原始类型是否会产生额外的空间时间开销?说,ulong真的只消耗8个字节的内存吗?

在精神上,这应该测试内存开销:

using System;

class Program
{
    static void Main()
    {
        long beforeAlloc = GC.GetTotalMemory(false);
        ulong[] myArray = new ulong[System.Int32.MaxValue];
        myArray[0] = 1;
        long afterAlloc = GC.GetTotalMemory(false);

        Console.WriteLine(((afterAlloc - beforeAlloc) / System.Int32.MaxValue).ToString());
     }
}

但是documentation指定GC.GetTotalMemory()方法只检索当前思想要分配的字节数,因此没有更复杂的方法找不到更简单的方法记忆分析器?

2 个答案:

答案 0 :(得分:3)

结构本身没有开销。但是,运行时可以自由填充任何复合类型作为对齐优化。

有关如何在运行时处理数组的详细信息,请参阅this question

答案 1 :(得分:1)

原始类型由编译器别名。无论您使用int还是System.Int32,结果代码都没有区别。在您的示例中,System.UInt64ulong都是结构体;它们都继承自System.ValueType。这是因为,事实上,它们属于同一类型。

但是,如果使用关键字,编译器会稍微快一些。当您使用Int32时,编译器会从范围内的所有其他类型中解析类型名称,并注意命名空间和using指令,以确定该类型不是其他类型其他人写的Int32类型。别名不会发生这种情况。

如果你能找到一个可以衡量这种差异的例子,我会非常惊讶!