Solaris 動的トレースガイド

配列宣言と記憶域

D では、第 3 章で説明した動的連想配列のほかに、「スカラー配列」もサポートされています。スカラー配列は、それぞれに同じ型の値が格納される、固定長の連続するメモリー配 置の集まりです。スカラー配列にアクセスするには、ゼロで始まる整数を使って、それぞれの位置を参照します。スカラー配列と C や C++ の配列の概念と構文は、直接対応しています。D では、スカラー配列は、連想配列やその応用である「集積体」ほどは多用されませんが、C で宣言された既存のオペレーティングシステムの配列データ構造にアクセスするとき、スカラー配列が必要になる場合があります。集積体については、第 9 章集積体で説明します。

以下では、int 型の 5 つの整数から成る D スカラー配列を宣言します。宣言の末尾には、接尾辞として、要素数を角括弧で囲んだものを付加します。

int a[5];

この配列の記憶域を視覚的に表現すると、次の図のようになります。

図 5–1 スカラー配列

5 つのオブジェクトから成る配列を示す図です。

D 式 a[0] は最初の配列要素、a[1] は 2 番目の配列要素 (以下同様) を参照しています。構文だけ見ると、スカラー配列は連想配列と非常によく似ています。たとえば、単一の整数キーによって参照される 5 つの整数から成る連想配列は、次のように宣言できます。

int a[int];

この配列は、式 a[0] を使って参照することもできます。一方、記憶域と実装について見ると、スカラー配列と連想配列は、まったく別物です。静的配列 a は、ゼロから順に番号付けされた連続した 5 つのメモリー配置で構成されています。インデックスは、この配列に割り当てられた記憶域内のオフセットを参照しています。これに対して、連想配列の場合、サイズは事前定義されておらず、要素は連続したメモリー配置には格納されません。また、連想配列のキーと対応する値の記憶域の位置には、何の関連性もありません。連想配列の要素 a[0]a[-5] にアクセスすると、DTrace により 2 ワード分のみの記憶域が割り当てられますが、これらの記憶域は連続しているとはかぎりません。連想配列のキーは、対応する値の抽象名になっており、値の記憶域の位置とは無関係です。

配列の作成時に初期値を割り当て、単一の整数式を配列インデックスとして使用した場合 (例: a[0] = 2)、式だけ見れば a をスカラー配列への代入と見なすことも可能ですが、D コンパイラは必ず、新しい連想配列を生成します。この場合、D コンパイラにこの配列をスカラー配列と判断させるには、あらかじめスカラー配列を宣言して、コンパイラに配列のサイズの定義を認識させる必要があります。