Classes de Armazenamento - ProjetoHotSpot/UaiFai GitHub Wiki
Classes de Armazenamento
Para armazenamento dos dados necessários à execução um programa aloca memória, a classe de armazenamento é a forma como se realiza essa alocação da memória.
A Classe extern
Usado para variáveis globais.
Indica que a variável em questão é a mesma que já está sendo declarada em um outro módulo ou arquivo do programa.
Razão:
Em "C" uma variável global só é global dentro de um arquivo de programa. Em outros arquivos ou módulos do mesmo program, ela é desconhecida. Redeclarar uma variável global em todos os arquivos do programa, leva, na verdade à criação de várias variáveis. Como "C" permite que módulos de um programa grande sejam compilados separadamente para então serem linkeditados juntos, é necessário que se possa referenciar variáveis globais declaradas em outros arquivos. extern antes de uma declaração de variável indica que não deve ser gerado código para alocação de memória para esta variável , mas sim um marcador que o linkeditor substitui por uma referência ao endereço da variável em tempo de linkagem. Solução: Declarar todas as variáveis globais utilizadas em muitos módulos em um arquivo único (tipicamente o módulo contendo a função main() ou meu_programa.h) :
A Classe static
Variáveis com alocação explicitamente estática, mesmo que sejam variáveis locais em uma função.
O especificador static indica ao compilador que para esta variável dever ser gerado código para alocação global de memória ao início do programa. Variáveis do tipo static, apesar de terem um armazenamento "global" são conhecidas exclusivamente dentro de seu escopo (função ou módulo).
Variáveis com armazenamento estático em funções
Utilidade: quando for necessário que variáveis de uma função preservem o seu valor entre chamadas dessa função. Se variáveis estáticas não fossem permitidas, variáveis globais teriam de ser admitidas, abrindo brechas para efeitos colaterais. Uma variável estática declarada em uma função não pode ser acessada de fora da função onde foi declarada.
Variáveis globais com armazenamento estático
Uma variável global é por definição, uma variável estática. Por que então declarar uma variável global explicitamente como estática ? Variáveis globais com a especificação static são limitadas ao escopo do arquivo (módulo) onde estão declaradas. É uma forma de se ter uma variável global para, por exemplo, um conjunto de funções, mas que não pode ser acessada por outras funções externas ao arquivo.
A Classe register
Criada para casos onde é necessário um armazenamento e acesso muito rápido a uma variável.
Originalmente instruia o compilador para gerar código para armazenar estas variáveis em um registrador da CPU ao invés da RAM. Dessa forma não era necessário acesso à memória para determinar ou modificar seu valor. Assim, operações repetidas utilizando estas variáveis podiam ocorrer muito mais rápido. Utilidade: computação gráfica, cálculo numérico. Padrão ANSI define atualmente que o compilador deve apenas procurar a forma de armazenamento mais rápida possível.
Exemplo: calcular um número elevado a uma potência inteira.
A Classe auto
Declaração explícita de uma variável local.
Desnecessário, pois o contexto é suficiente.
- Determina a utilização do stack para o armazenamento de seu valor.
- Variáveis auto só podem ser referenciadas de dentro do bloco onde foram declaradas.
- Devem ser declaradas logo no início do bloco.