Guia de rastreamento dinâmico Solaris

Declarações e armazenamento de matriz

D oferece suporte a matrizes escalares além das matrizes de associação dinâmicas descritas no Capítulo 3. As matrizes escalares são um grupo de tamanho fixo de locais de memória consecutivos que armazenam um valor do mesmo tipo. As matrizes escalares são acessadas quando se faz referência a cada local que tenha um inteiro começando a partir de zero. As matrizes escalares correspondem diretamente em conceito e sintaxe às matrizes em C e C++. As matrizes escalares não são usadas tão freqüentemente em D como as matrizes de associação e suas contrapartes mais avançadas, as agregações, mas elas às vezes são necessárias durante o acesso a estruturas de dados de matriz existentes do sistema operacional declaradas em C. As agregações são descritas no Capítulo 9Agregações.

Uma matriz escalar de D de 5 inteiros será declarada através do tipo int e da colocação de um sufixo na declaração com o número de elementos entre colchetes, da seguinte forma:

int a[5];

O diagrama seguinte mostra uma representação visual do armazenamento da matriz:

Figura 5–1 Representação de matriz escalar

O diagrama mostra uma imagem de uma matriz de cinco objetos.

A expressão de D a[0] é usada para fazer referência ao primeiro elemento da matriz, a[1] se refere ao segundo, e assim por diante. De uma perspectiva sintática, as matrizes escalares e as matrizes de associação são muito semelhantes. Você pode declarar uma matriz associativa de cinco inteiros referenciada por uma chave de inteiro, da seguinte forma:

int a[int];

e também pode referenciar essa matriz usando a expressão a[0]. Mas de uma perspectiva de armazenamento e de implementação, as duas matrizes são muito diferentes. A matriz estática a consiste em cinco locais de memória consecutivos numerados a partir de zero e o índice se refere a um desvio no armazenamento alocado da matriz. Por outro lado, uma matriz associativa não tem tamanho predefinido e não armazena elementos em locais de memória consecutivos. Além disso, as chaves de matriz de associação não têm relação com o local de armazenamento do valor correspondente. Você pode acessar os elementos de matriz associativa a[0] e a[-5], e apenas duas palavras de armazenamento, que podem ou não ser consecutivas, serão alocadas pelo DTrace. As chaves de matriz associativa são nomes abstratos do valor correspondente que não tem relação com os locais de armazenamento de valor.

Se você criar uma matriz usando uma atribuição inicial e utilizar uma única expressão de inteiro como o índice de matriz (por exemplo, a[0] = 2), o compilador de D sempre criará uma nova matriz associativa, embora nessa expressão a também pudesse ser interpretado como uma atribuição a uma matriz escalar. As matrizes escalares devem ser declaradas previamente nesta situação, para que o compilador de D possa ver a definição do tamanho da matriz e deduzir que a matriz é uma matriz escalar.