从图中可以看出,嵌套数组中的元素无法被直接访问,而必须先根据元素每一维索引值找到相应的子数组,然后再在子数组中进行进一步的索引。例如,对于a[2][2]的访问必须先找到子数组a[2],然后再在a[2]中访问下标为2的元素。而在多维数组当中,由于用于存储元素的内存空间是连续的,而且数组的每一维元素个数固定,所以可以轻易的根据元素各维的索引值计算出元素在数组内存中偏移量,这样我们就可以直接访问多维数组中的某个元素了。例如,在一个b[6,7]的数组中,b[2,2]元素的偏移量为2*7+2=16,那么b[2,2]实际上是在数组b的数据内存中的第16个元素。至此,直觉告诉我们使用多维数组应该能够获得比嵌套数组更好的性能,因为简单的数学计算要比间接内存访问高效的多。似乎已经可以把”使用多维数组而不是嵌套数组“写入我们的经验手册了。
但是,仅凭直觉得来的结论终究显得有点弱不禁风,在为这一结论竖碑立说之前,我们需要更多的判断依据。也许c#编译器生成的中介代码(msil)会有所帮助——况且.net的“汇编”代码看上去也并不那么神秘。
下面的测试代码中,分别定义了嵌套数组和二维数组的实例,并对其中的一个元素进行累加操作:
//jaggged array operation
int[][] ja = new int[3][];
…
ja[1][2] ++;