Guia de rastreamento dinâmico Solaris

Matrizes de associação

As matrizes de associação são usadas para representar as coleções de elementos de dados que podem ser recuperados pela especificação de um nome chamado chave. As chaves de matriz de associação de D são formadas por uma lista de valores de expressão escalar chamado tupla. Você pode pensar na tupla de matriz como uma lista de parâmetros imaginários de uma função que é chamada para recuperar o valor da matriz correspondente quando você faz referência à matriz. Cada matriz de associação de D possui uma assinatura de chave fixa que consiste em um número fixo de elementos de tupla, onde cada elemento possui um determinado tipo fixo. Você pode definir assinaturas de chave diferentes para cada matriz em seu programa em D.

As matrizes de associação são diferentes das matrizes de tamanho fixo normais, pois não possuem limite predefinido no número de elementos. Os elementos podem ser indexados por qualquer tupla, ao contrário de usar apenas inteiros como chaves, além disso, os elementos não são armazenados em locais de armazenamento consecutivos pré-alocados. As matrizes de associação são úteis em situações em que você usaria uma tabela hash ou outra estrutura de dados de dicionário simples em um programa de linguagem C, C++ ou Java. TM As matrizes de associação o ajudam a criar um histórico dinâmico de eventos e estado, capturado em seu programa em D, que você pode usar para criar fluxos de controle mais complexos.

Para definir uma matriz de associação, escreva uma expressão de atribuição no formato:

nome [ chave ] = expressão ;

onde nome é qualquer identificador D válido e chave é uma lista separada por vírgula de uma ou mais expressões. Por exemplo, a declaração seguinte define uma matriz de associação a com assinatura de chave [ int, string ] e armazena o valor inteiro 456 em um local nomeado pela tupla [ 123, "olá" ]:

a[123, "hello"] = 456;

O tipo de cada objeto contido na matriz de todos os elementos de uma determinada matriz. Como a foi atribuída primeiro por meio do inteiro 456, cada valor subseqüente armazenado na matriz também será do tipo int. Você pode usar qualquer um dos operadores de atribuição definidos no Capítulo 2 para modificar elementos de matriz de associação, sujeitos às regras de operando definidas para cada operador. O compilador D produzirá uma mensagem de erro apropriada, se você tentar uma atribuição incompatível. Você pode usar qualquer tipo com uma chave de matriz de associação ou valor que você pode usar com uma variável escalar. Você não pode aninhar uma matriz de associação em outra matriz de associação como uma chave ou valor.

Você pode fazer referência a uma matriz de associação por meio de qualquer tupla que seja compatível com a assinatura de chave de matriz. As regras de compatibilidade de tupla são semelhantes às de chamadas de função e atribuições de variável: a tupla deve ser do mesmo tamanho e cada tipo da lista de parâmetros atuais deve ser compatível com o tipo correspondente na assinatura de chave formal. Por exemplo, se uma matriz de associação x for definida da seguinte forma:

x[123ull] = 0;

então, a assinatura de chave é do tipo unsigned long long e os valores são do tipo int. Essa matriz também pode ser referenciada por meio da expressão x['a'] porque a tupla consiste na constante de caractere 'a' do tipo int e o tamanho um é compatível com a assinatura de chave unsigned long long, de acordo com as regras de conversão aritmética descritas em Tipos de conversões.

Se você precisar declarar explicitamente uma matriz de associação de D antes de usá-la, crie uma declaração do nome da matriz e da assinatura de chave fora das cláusulas de teste no código-fonte do seu programa:

int x[unsigned long long, char];

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

Quando uma matriz de associação é definida, as referências a qualquer tupla ou assinatura de chave compatível são permitidas, mesmo que a tupla em questão não tenha sido atribuída anteriormente. O acesso ao elemento de matriz de associação não atribuída é definido para retornar um objeto preenchido com zeros. Uma conseqüência dessa definição é que o armazenamento subjacente não é alocado para um elemento de matriz de associação até que um valor diferente de zero seja atribuído a esse elemento. Contrariamente, atribuir um elemento de matriz de associação a zero faz com que o DTrace desaloque o armazenamento subjacente. Esse comportamento é importante porque o espaço de variável dinâmica, do qual os elementos de matriz de associação são alocados, é finito; caso o espaço termine durante uma tentativa de alocação, a alocação falhará e será gerada uma mensagem de erro indicando uma queda de variável dinâmica. Sempre atribua zero a elementos de matriz de associação que não estão mais sendo usados. Consulte o Capítulo 16Opções e ajustáveis para obter outras técnicas de eliminar interrupções de variável dinâmica.