C#基元类型别名的结构开销?
我注意到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);
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的结构有更多的开销吗?iestructmyint{inta;}
vsinta代码>