我注意到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());
}
}
但是documentation指定GC.GetTotalMemory()
方法只检索当前思想要分配的字节数,因此没有更复杂的方法找不到更简单的方法记忆分析器?
答案 0 :(得分:3)
结构本身没有开销。但是,运行时可以自由填充任何复合类型作为对齐优化。
有关如何在运行时处理数组的详细信息,请参阅this question。
答案 1 :(得分:1)
原始类型由编译器别名。无论您使用int
还是System.Int32
,结果代码都没有区别。在您的示例中,System.UInt64
和ulong
都是结构体;它们都继承自System.ValueType。这是因为,事实上,它们属于同一类型。
但是,如果使用关键字,编译器会稍微快一些。当您使用Int32
时,编译器会从范围内的所有其他类型中解析类型名称,并注意命名空间和using
指令,以确定该类型不是其他类型其他人写的Int32
类型。别名不会发生这种情况。
如果你能找到一个可以衡量这种差异的例子,我会非常惊讶!