Handbuch zur dynamischen Ablaufverfolgung in Solaris

Vektordeklarationen und Speicherung

D bietet neben den in Kapitel 3 beschriebenen dynamischen assoziativen Vektoren Unterstützung für Skalare Vektoren. Unter skalaren Vektoren versteht man eine Gruppe festgelegter Länge, die aufeinander folgender Speicheradressen enthält. In jeder dieser Adressen wird ein Wert vom gleichen Datentyp gespeichert. Auf skalare Vektoren wird durch Referenzierung auf die einzelnen Positionen mit einer Ganzzahl, ausgehend von Null, zugegriffen. Skalare Vektoren stimmen konzeptuell und syntaktisch direkt mit Vektoren in C und C++ überein. In D werden sie nicht so häufig eingesetzt wie assoziative Vektoren und ihre erweiterten Gegenstücke, die Aggregate, sind aber manchmal für den Zugriff auf vorhandene, in C deklarierte Betriebssystem-Vektordatenstrukturen nötig. Aggregate werden in Kapitel 9Aggregate beschrieben.

Ein skalarer Vektor von 5 Ganzzahlen ließe sich in D wie folgt mit dem Typ int deklarieren, wobei der Deklaration die Anzahl der Elemente in eckigen Klammern voranzustellen ist:

int a[5];

Das folgende Diagramm veranschaulicht die Vektorspeicherung:

Abbildung 5–1 Darstellung skalarer Vektoren

Schaubild eines Vektors mit fünf Objekten.

Der D-Ausdruck a[0] dient zur Referenzierung des ersten Vektorelements, a[1] referenziert das zweite und so weiter. Aus syntaktischer Sicht sind sich skalare und assoziative Vektoren sehr ähnlich. Sie können einen assoziativen Vektor von fünf Ganzzahlen, der mit einem Ganzzahlschlüssel referenziert wird, wie folgt deklarieren:

int a[int];

und diesen Vektor auch über den Ausdruck a[0] referenzieren. Aus Sicht der Speicherung und Implementation hingegen unterscheiden sich die beiden Vektoren sehr stark voneinander. Der statische Vektor a besteht aus fünf aufeinander folgenden, ab Null durchnummerierten Speicherpositionen und der Index verweist auf einen Versatz (Offset) in dem für den Vektor reservierten Speicherbereich. Dagegen haben assoziative Vektoren keine vordefinierte Größe und speichern Elemente nicht an aufeinander folgenden Speicherpositionen. Außerdem haben die Schlüssel assoziativer Vektoren keine Beziehung zur Speicherposition des entsprechenden Werts. Sie können auf die assoziativen Vektorelemente a[0] und a[-5] zugreifen, und DTrace reserviert nur zwei Speicherwörter, die aufeinander folgend sein können oder nicht. Bei den Schlüsseln assoziativer Vektoren handelt es sich um abstrakte Namen für die entsprechenden Werte, die keine Beziehung zu den Speicherpositionen der Werte haben.

Wenn Sie einen Vektor mit anfänglicher Zuweisung erstellen und einen einzelnen Ganzzahlausdruck als Vektorindex einsetzen (zum Beispiel a[0] = 2), erzeugt der D-Compiler stets einen neuen assoziativen Vektor, selbst wenn a in diesem Ausdruck auch als Zuweisung zu einem skalaren Vektor interpretiert werden könnte. In einer solchen Situation müssen skalare Vektoren vordeklariert werden, damit der D-Compiler die Definition der Vektorgröße erkennen und schließen kann, dass es sich um einen skalaren Vektor handelt.