引用类型数组 — 8字节
值类型数组 — 4+8*rank(维度数)
引用类型数组 — 8+8*rank(维度数)
表中的一些内容在文章后面进行了比较详细的讲述。从表中我们可以清楚地看到,sz数组性能要远远优于md数组,交错数组可以看作数组元素是sz数组的sz数组,当然在性能上它要优于md数组。不过要记住一点,交错数组不兼容cls,因此它不能在不同的语言编写的代码之间传递。
数组的il优化
using system;
namespace abc
{
class class1
{
[stathread]
static void main(string[] args)
{
int[] a=new int[5];
int[,] c=new int[5,5];
a[0]=1;
c[0,0]=1;
}
}
}
上面代码的il代码如下:
.method private hidebysig static void main(string[] args) cil managed
{
.entrypoint
.custom instance void [mscorlib]system.stathreadattribute::.ctor() = ( 01 00 00 00 )
// code size 29 (0x1d)
.maxstack 4
.locals ([0] int32[] a,
[1] int32[0...,0...] c)
il_0000: ldc.i4.5
il_0001: newarr [mscorlib]system.int32
il_0006: stloc.0
il_0007: ldc.i4.5
il_0008: ldc.i4.5
il_0009: newobj instance void int32[0...,0...]::.ctor(int32,
int32)
il_000e: stloc.1
il_000f: ldloc.0
il_0010: ldc.i4.0
il_0011: ldc.i4.1
il_0012: stelem.i4
il_0013: ldloc.1
il_0014: ldc.i4.0
il_0015: ldc.i4.0
il_0016: ldc.i4.1
il_0017: call instance void int32[0...,0...]::set(int32,
int32,
int32)
il_001c: ret
} // end of method class1::main
对比一下给sz数组和md数组付值的il代码:给数组a付值使用stelem.i4 指令,而给多维数组付值则必须调用set方法。
数组内部字段