C#基元类型别名的结构开销?

C#基元类型别名的结构开销?,c#,memory,types,primitive-types,overhead,C#,Memory,Types,Primitive Types,Overhead,我注意到C#中的原语类型实际上只是作为System命名空间中定义的结构的别名实现的,例如ulong是System.UInt64的别名,属于struct类型。C#中的基元类型是否会因此产生额外的时空开销?比如说,ulong真的只消耗8字节的内存吗 实际上,这应该测试内存开销: using System; class Program { static void Main() { long beforeAlloc = GC.GetTotalMemory(false);

我注意到C#中的原语类型实际上只是作为
System
命名空间中定义的结构的别名实现的,例如
ulong
System.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.UInt64
ulong
都是结构;它们都继承自System.ValueType。这是因为,事实上,它们是同一类型的

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


如果你能找到一个例子,说明这种差异实际上是可以测量的,我会非常惊讶

不,没有开销。你为什么会有开销?谢谢!我有两个后续问题,(1)有没有比
GC.getTotalMemy()
更快速、更可靠的方法来检验这个假设?(2-与主要问题无关)由于运行时填充了复合类型,将结构成员从大到小进行重新排列是否有优势?这取决于您所寻找的。请记住,CLR代表应用程序充当菜单管理器,因此它将在操作系统级别分配和释放内存。这里真正的问题可能是你为什么想知道?只是出于好奇。我在玩C中分配在地址空间不同部分的结构位置,决定研究其他语言,在C中遇到了这个奇怪的规范。我想知道是否可以通过重新排列结构成员将结构压缩到1或2个缓存线是一个很好的技巧。:)@BrianRasmussen包含单个int的结构会比仅包含int的结构有更多的开销吗?ie
structmyint{inta;}
vs
inta