Solaris 动态跟踪指南

数组声明和存储

除了第 3 章中说明的动态关联数组之外,D 还支持标量数组。标量数组是一组固定长度的连续内存位置,每个位置存储一个相同类型的值。可通过使用从零开始的整数引用每个位置来访问标量数组。标量数组直接对应于 C 和 C++ 中数组的概念和语法。虽然在 D 中使用标量数组不如使用关联数组和其高级对应项(聚合)那么频繁,但在访问 C 中声明的现有操作系统数组数据结构时有时会需要使用标量数组。将会在第 9 章中介绍聚合。

由 5 个整数组成的 D 标量数组应这样声明:使用类型 int,并在声明后加上用方括号括起来的元素数目,如下所示:

int a[5];

下图显示了数组存储的可视表示:

图 5–1 标量数组表示

该图显示了由 5 个对象组成的数组的图片。

D 表达式 a[0] 用于引用第一个数组元素,a[1] 引用第二个数组元素,依此类推。从语法的角度来看,标量数组和关联数组非常相似。可声明由 5 个整数(通过整数键引用)组成的关联数组,如下所示:

int a[int];

并且使用表达式 a[0] 来引用此数组。但从存储和实现角度来看,两个数组有很大的不同。静态数组 a 由 5 个连续内存位置(编号从 0 开始)组成,并且索引表示存储空间中为此数组分配的偏移。另一方面,关联数组没有预定义大小,并且不会将元素存储在连续内存位置中。此外,关联数组键与相应的值存储位置无关。可访问关联数组元素 a[0]a[-5],并且 DTrace 只分配两个词的存储空间,它们可能连续,也可能不连续。关联数组键是相应值的抽象名称,与值存储位置无关。

如果使用初始赋值创建数组,并将一个整数表达式用作数组索引(如 a[0] = 2),则 D 编译器将始终创建新的关联数组,即使在此表达式中 a 还可解释为对标量数组的赋值。在此情况下,必须预先声明标量数组,以便 D 编译器能够了解数组大小的定义并推断此数组为标量数组。