★背景知识
首先了解一些相关的概念:
数组元素:数组包含的值;
数组长度:数组可以包含的元素的个数;
维度数:数组的维度总数;
下限:数组指定的维度的起始索引。多维数组每个维可以有不同的下限。
运行时有两种不同的数组实现--SZ数组和普通数组。SZ数组是以0为下限的一维数组;普通数组指多维的或者下限不为0的数组。有时候我们称呼多维数组为MD数组。由于SZ数组较常用,微软对它的性能进行了极大的优化。下面的表详细列出了SZ数组与MD数组的区别。
SZ数组 | MD数组 | |
定义 | 一维的,以0为下限的数组 | 多维的,或者下限不为0的数组 |
C#语法 | Object[] Object[][] (交错数组) |
Object[,] ---二维数组 |
是否兼容CLS | 兼容(交错数组除外) | 不兼容 |
IL优化 | 使用专用的IL指令来操作这些数组,比如:ldlen,stelem等等 | 在1.0版本,没有专用的IL指令,对数组的所有操作都是通过方法调用来实现 |
方法优化 | 基元类型数组有专用的方法,这些方法在操作一些值类型数组时不用反复的装箱,所以具有较高的性能 | 在1.0版本,引用类型和值类型数组使用同样的方法。值类型在方法调用时被反复地装箱和拆箱,造成了极大的性能冲击 |
基本长度(不包括8字节的方法表指针和对象头) | 值类型数组 — 4字节 引用类型数组 — 8字节 |
值类型数组 — 4+8*rank(维度数) 引用类型数组 — 8+8*rank(维度数) |
JIT优化 | JIT |