.NET中数组的隐秘特性[3]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 dy_2000_abc 的 blog

引用类型数组 — 8字节

值类型数组 — 4+8*rank(维度数)

引用类型数组 — 8+8*rank(维度数)

jit优化 jit编译器消除了范围检查 jit编译器没有对它进行优化。clr将会执行额外的代码对每一维进行范围检查


       表中的一些内容在文章后面进行了比较详细的讲述。从表中我们可以清楚地看到,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方法。

数组内部字段

本文关键:数组 Array ArrayList .net
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top