Guía de seguimiento dinámico de Solaris

Matrices asociativas

Las matrices asociativas se utilizan para representar conjuntos de elementos de datos que se pueden recuperar especificando un nombre llamado clave. Las matrices asociativas de D están formadas por una lista de valores de expresiones escalares llamadas tuplas. Puede considerar que una tupla de matriz es como una lista de parámetros imaginarios de una función que se ejecuta para recuperar el valor de matriz correspondiente cuando se hace referencia a la matriz. Cada matriz asociativa de D tiene una firma clave que incluye un número fijo de elementos de tupla, donde cada elemento tiene un tipo concreto fijo. Puede definir distintas firmas clave para cada matriz en los programas escritos en D.

Las matrices asociativas difieren de las matrices normales de tamaño fijo en que no tienen un límite predefinido en el número de elementos: los elementos se pueden indexar mediante cualquier tupla, a diferencia del uso exclusivo de enteros como claves, y los elementos no se almacenan en ubicaciones de almacenamiento consecutivas preasignadas. Estas matrices son útiles en situaciones en las que se necesita usar una tabla hash u otras estructuras de datos de diccionario simples escritas en lenguaje de programación C, C++ o Java. TM Las matrices asociativas le permiten crear un historial dinámico de los eventos y estados capturados en el programa escrito en D que se pueden usar para crear un flujo de control mucho más complejo.

Para definir una matriz asociativa, debe escribir una expresión de asignación del tipo:

nombre [ clave ] = expresión ;

donde nombre es cualquier identificador de D válido y clave es una lista separada por comas de una o varias expresiones. Por ejemplo, la siguiente declaración define una matriz asociativa a con una firma clave [ int, string ] y almacena el valor del entero 456 en una ubicación llamada mediante la tupla [ 123, "hello" ]:

a[123, "hello"] = 456;

El tipo de cada objeto incluido en la matriz también es fijo para todos los elementos de una matriz concreta. Dado que a se asignó en primer lugar usando el entero 456, cada valor subsiguiente almacenado en la matriz será también del tipo int. Puede usar cualquiera de los operadores de asignación definidos en el capítulo 2 para modificar los elementos de las matrices asociativas, en función de las reglas de los operandos establecidas para cada operador. El compilador D generará un mensaje de error adecuado si intenta realizar una asignación incompatible. Puede usar cualquier tipo con una clave de matriz asociativa o valor que pueda usar con una variable escalar. No se puede anidar una matriz asociativa en otra matriz asociativa como una clave o valor.

Puede hacer referencia a una matriz asociativa usando una tupla que sea compatible con la firma clave de la matriz. Las reglas para la compatibilidad de las tuplas son similares a las de las llamadas de funciones y asignaciones de variables: la tupla debe tener la misma longitud y cada tipo de la lista de parámetros reales debe ser compatible con el tipo correspondiente en la firma clave formal. Por ejemplo, si una matriz asociativa x se define de la siguiente forma:

x[123ull] = 0;

entonces la firma clave es del tipo unsigned long long y los valores son del tipo int. A esta matriz también se puede hacer referencia usando la expresión x['a'] porque la tupla consta del carácter constante 'a' del tipo int y la longitud uno es compatible con la firma clave unsigned long long en función de las reglas de conversión aritméticas descritas en conversiones de tipos.

Si necesita declarar explícitamente una matriz asociativa en D antes de usarla, puede crear una declaración del nombre de matriz y la firma clave fuera de las cláusulas del sondeo en el código fuente del programa:

int x[unsigned long long, char];

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

Una vez que se define una matriz asociativa, se permiten las referencias a cualquier tupla de una firma clave compatible, incluso si la tupla en cuestión no se ha asignado previamente. El acceso a un elemento de matriz asociativa sin asignar está definido para devolver un objeto sin contenido. Una consecuencia de esta definición es que el almacenamiento subyacente no se asigna para un elemento de matriz asociativa hasta que un valor que no sea cero se asigne a dicho elemento. Por el contrario, al asignar un elemento de matriz asociativa a cero se consigue que DTrace elimine la asignación del almacenamiento subyacente. Este comportamiento es importante porque el espacio de variable dinámica fuera del que se asignan los elementos de matriz asociativa es finito; si se agota cuando se intenta una asignación, la asignación fallará y se generará un mensaje de error indicando una caída de variable dinámica. Asigne cero a los elementos de matrices asociativas que ya no estén en uso. Consulte el Capítulo 16Opciones y optimizables, para obtener información sobre otras técnicas para eliminar anulaciones de variables dinámicas.