Handbuch zur dynamischen Ablaufverfolgung in Solaris

Assoziative Vektoren

Assoziative Vektoren dienen zum Darstellen von Sammlungen von Datenelementen, die durch Angabe eines Namens, des Schlüssels, abgerufen werden können. In D werden die Schlüssel assoziativer Vektoren in Form von Listen skalarer Ausdruckswerte namens Tupel gebildet. Das Vektortupel selbst können Sie sich als eine Parameterliste für eine Funktion vorstellen, die zur Ermittlung des entsprechenden Vektorwerts aufgerufen wird, wenn Sie den Vektor referenzieren. Jeder assoziative Vektor in D besitzt eine feststehende Schlüsselsignatur, die aus einer festen Anzahl von Tupelelementen besteht. Dabei ist jedem Element ein fester Typ zugeordnet. Sie können für jeden Vektor in einem D-Programm unterschiedliche Schlüsselsignaturen definieren.

Assoziative Vektoren unterscheiden sich von normalen Vektoren mit fester Größe dadurch, dass sie keine vordefinierte Mengenbeschränkung für Elemente haben, die Elemente durch ein beliebiges Tupel indiziert werden können, anstatt dass nur Ganzzahlen als Schlüssel eingesetzt werden, und schließlich dadurch, dass die Elemente nicht an vorreservierten, aufeinander folgenden Speicherpositionen gespeichert werden. Assoziative Vektoren sind dann hilfreich, wenn Sie in einem Programm in C, C++ oder JavaTM eine Hash-Tabelle oder andere einfache Dictionary-Datenstrukturen einsetzen würden. Mit assoziativen Vektoren können Sie ein dynamisches Protokoll der innerhalb des D-Programms erfassten Ereignisse und Statusinformationen erstellen, auf dessen Grundlage sich komplexere Kontrollstrukturen bilden lassen.

Zum Definieren eines assoziativen Vektors schreiben Sie einen Zuweisungsausdruck der Form:

Name [ Schlüssel ] = Ausdruck ;

dabei ist Name ein beliebiger, gültiger D-Bezeichner und Schlüssel ist eine Liste eines oder mehrerer durch Komma getrennter Ausdrücke. Beispielsweise definiert die folgende Anweisung einen assoziativen Vektor a mit der Schlüsselsignatur [ int, string ] und speichert den ganzzahligen Wert 456 an einer nach dem Tupel benannten Position [ 123, "hello" ]:

a[123, "hello"] = 456;

Auch der Objekttyp ist für sämtliche Elemente in einem Vektor festgelegt. Da a zuerst die Ganzzahl 456 zugewiesen wurde, erhält auch jeder weitere in diesem Vektor gespeicherte Wert den Typ int. Zum Ändern der Elemente in assoziativen Vektoren stehen Ihnen alle in Kapitel 2 definierten Zuweisungsoperatoren zur Verfügung. Dabei sind die für die einzelnen Operatoren genannten Operandenregeln zu beachten. Bei unverträglichen Zuweisungsversuchen gibt der D-Compiler eine entsprechende Fehlermeldung aus. Für die Schlüssel oder Werte assoziativer Vektoren können alle Typen verwendet werden, die auch für skalare Variablen zulässig sind. Es ist nicht möglich, einen assoziativen Vektor als Schlüssel oder Wert in einen anderen assoziativen Vektor zu schachteln.

Ein assoziativer Vektor kann mit jedem mit der Vektorschlüsselsignatur verträglichen Tupel referenziert werden. Die Regeln für die Tupelkompatibilität stimmen mit jenen für Funktionsaufrufe und Variablenzuweisungen überein: Das Tupel muss dieselbe Länge haben, und jeder Typ in der Liste der tatsächlichen Parameter muss mit dem entsprechenden Typ in der formalen Schlüsselsignatur verträglich sein. Wenn zum Beispiel ein assoziativer Vektor x wie folgt definiert wird:

x[123ull] = 0;

dann erhält die Schlüsselsignatur den Typ unsigned long long und die Werte nehmen den Typ int an. Dieser Vektor kann auch mit dem Ausdruck x['a'] referenziert werden, da das aus der Zeichenkonstante 'a' bestehende Tupel des Typs int und der Länge 1 gemäß den unter·Typumwandlungen beschriebenen arithmetischen Umwandlungsregeln mit der Schlüsselsignatur unsigned long long verträglich ist.

Wenn Sie einen assoziativen Vektor in D vor der Verwendung explizit deklarieren müssen, können Sie in den Programmquellcode die Deklaration des Vektornamens und der Schlüsselsignatur außerhalb der Prüfpunktklauseln einfügen.

int x[unsigned long long, char];

BEGIN
{
	x[123ull, 'a'] = 456;
}

Nach der Definition eines assoziativen Vektors sind Referenzen auf ein beliebiges Tupel mit verträglicher Schlüsselsignatur möglich, selbst dann, wenn noch keine Zuweisung für das betreffende Tupel erfolgt ist. Der Zugriff auf ein Element eines assoziativen Vektors ohne Zuweisung gibt nach Definition ein mit Nullen angefülltes Objekt zurück. Eine Folge dieser Definition ist, dass für das Element des assoziativen Vektors erst nach Zuweisung eines Werts ungleich Null Speicher reserviert wird. Umgekehrt hebt DTrace die Speicherzuweisung auf, wenn einem Element eines assoziativen Vektors der Wert Null zugewiesen wird. Dieses Verhalten ist deshalb wichtig, weil der dynamische Variablenbereich, aus dem die Elemente assoziativer Vektoren zugewiesen werden, endlich ist. Sollte dieser Bereich bei einem Zuweisungsversuch bereits erschöpft sein, schlägt die Zuweisung mit einer Fehlermeldung über eine dynamische Variablenauslassung fehl. Weisen Sie Elementen assoziativer Vektoren, die nicht mehr benötigt werden, immer den Wert Null zu. Weitere Verfahren zur Eliminierung der dynamischen Übergabe von Variablen finden Sie in Kapitel 16Optionen und Tunables .