繁体   English   中英

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

[英]Struct overhead of C# primitive type aliases?

我注意到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());
     }
}

但是文档指定GC.GetTotalMemory()方法只检索当前认为要分配的字节数,那么没有更复杂的内存分析器就没有简单的方法可以找到它吗?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM