Variável estática - Static variable

Em programação de computador , uma variável estática é uma variável que foi alocada "estaticamente", o que significa que seu tempo de vida (ou "extensão") é toda a execução do programa. Isso contrasta com as variáveis ​​automáticas de vida curta , cujo armazenamento é alocado e desalocado na pilha de chamadas ; e em contraste com os objetos , cujo armazenamento é alocado e desalocado dinamicamente na memória heap .

O tempo de vida da variável é contrastado com o escopo (onde uma variável pode ser usada): "global" e "local" referem-se ao escopo, não ao tempo de vida, mas o escopo geralmente implica o tempo de vida. Em muitas linguagens, as variáveis ​​globais são sempre estáticas, mas em algumas linguagens elas são dinâmicas, enquanto as variáveis ​​locais são geralmente automáticas, mas podem ser estáticas.

Em geral, A alocação de memória estática é a alocação de memória emtempo de compilação, antes que o programa associado seja executado, ao contrário daalocação de memória dinâmicaoualocaçãoautomática de memóriaonde a memória é alocada conforme necessário emtempo de execução.

História

Variáveis ​​estáticas datam de pelo menos ALGOL 60 (1960), onde são conhecidas como variáveis próprias :

Uma declaração pode ser marcada com o próprio declarador adicional . Isso tem o seguinte efeito: ao entrar novamente no bloco, os valores das próprias grandezas permanecerão inalterados de seus valores na última saída, enquanto os valores das variáveis ​​declaradas que não estão marcadas com própria são indefinidos.

-  Relatório revisado sobre o ALGOL 60, seção "5. Declarações", p. 14

Essa definição é sutilmente diferente de uma variável estática: ela apenas especifica o comportamento e, portanto, o tempo de vida, não o armazenamento: uma variável própria pode ser alocada quando uma função é chamada pela primeira vez, por exemplo, em vez de no tempo de carregamento do programa.

O uso da palavra estático para se referir a essas variáveis ​​data pelo menos de BCPL (1966), e foi popularizado pela linguagem de programação C , que foi fortemente influenciada pelo BCPL. A definição BCPL diz:

(1) Itens de dados estáticos:
aqueles itens de dados cujas extensões duram tanto quanto o tempo de execução do programa; tais itens de dados têm Lvalues ​​constantes do manifesto. Cada item de dados estáticos deve ter sido declarado em uma função ou definição de rotina, em uma declaração global ou como um rótulo definido por dois pontos.

-  O Manual de Referência BCPL, 7.2 Alocação de Espaço e Extensão de Itens de Dados

Observe que o BCPL definiu um "item de dados dinâmico" para o que agora é chamado de variável automática (local, alocação em pilha), não para objetos alocados em heap, que é o uso atual do termo alocação dinâmica .

A staticpalavra - chave é usada em C e linguagens relacionadas para variáveis ​​estáticas e outros conceitos.

Endereçando

O modo de endereçamento de endereço absoluto só pode ser usado com variáveis ​​estáticas, porque esses são os únicos tipos de variáveis ​​cuja localização é conhecida pelo compilador em tempo de compilação. Quando o programa (executável ou biblioteca) é carregado na memória, as variáveis ​​estáticas são armazenadas no segmento de dados do espaço de endereço do programa (se inicializado) ou no segmento BSS (se não inicializado), e são armazenadas nas seções correspondentes dos arquivos de objeto antes para carregar.

Alcance

Em termos de escopo e extensão , as variáveis ​​estáticas abrangem toda a execução do programa, mas podem ter um escopo mais limitado . Uma distinção básica é entre uma variável global estática , que tem escopo global e, portanto, está no contexto em todo o programa, e uma variável local estática , que tem escopo local. Uma variável local estática é diferente de uma variável local, pois uma variável local estática é inicializada apenas uma vez, não importando quantas vezes a função na qual ela reside é chamada e seu valor é retido e acessível através de muitas chamadas para a função na qual é declarada , por exemplo, para ser usado como uma variável de contagem. Uma variável estática também pode ter escopo de módulo ou alguma variante, como ligação interna em C , que é uma forma de escopo de arquivo ou escopo de módulo.

Exemplo

Um exemplo de variável local estática em C:

#include <stdio.h>

void Func() {
  static int x = 0;
  // |x| is initialized only once across five calls of |Func| and the variable
  // will get incremented five times after these calls. The final value of |x|
  // will be 5.
  x++;
  printf("%d\n", x);  // outputs the value of |x|
}

int main() {
  Func();  // prints 1
  Func();  // prints 2
  Func();  // prints 3
  Func();  // prints 4
  Func();  // prints 5

  return 0;
}

Programação orientada a objetos

Na programação orientada a objetos , há também o conceito de uma variável de membro estático , que é uma " variável de classe " de uma classe definida estaticamente, ou seja, uma variável de membro de uma determinada classe que é compartilhada por todas as instâncias (objetos), e está acessível como uma variável de membro desses objetos. Uma variável de classe de uma classe definida dinamicamente, em linguagens onde as classes podem ser definidas em tempo de execução, é alocada quando a classe é definida e não é estática.

Constantes de objeto conhecidas em tempo de compilação, como literais de string , geralmente são alocadas estaticamente. Na programação orientada a objetos, as tabelas de métodos virtuais de classes são geralmente alocadas estaticamente. Um valor definido estaticamente também pode ser global em seu escopo, garantindo que o mesmo valor imutável seja usado em toda a execução para consistência.

Veja também

Notas

Referências