
A alocação estática de memória utiliza de instruções de alto nível (não convertidas diretamente em instruções de um processador) para, explicitamente, informar ao compilador quais são os espaços de memória que o programa escrito deseja utilizar. Esta instrução é conhecida na programação como o ato de “declarar uma variável”.
Para declarar uma variável em uma linguagem de programação geralmente são informados dois dados: o tipo de dado (Ex.: int, float, double etc) e um nome (ex.: numA, numB, sum etc) para a variável. Os tipos de dados e as regras de escrita dos nomes variam de acordo com a documentação da linguagem de programação utilizada. Como, por exemplo, a declaração de três variáveis inteiras numA, numB e sum em linguagem C é dada por:
O nome em uma declaração de variável nada mais é do que um rótulo que indica um espaço de memória. Este espaço de memória é alocado em uma parte do segmento de um processo chamada pilha (ou STACK). Já o tipo de dado caracteriza o tamanho do espaço de memória (quantidade de registros) a ser reservado para o armazenamento e manipulação de uma informação por um programa.
Para a alocação estática de memória um programa controla a pilha de memória “empilhando” os espaços de memória reservados para cada tipo de dado, uns sobre os outros. (Tabela 01)
Tabela 01 – Pilha de Memória na Alocação Estática de Três inteiros numA, numB e sum.
Tipo | Nome |
Pilha | Tamanho | |
---|---|---|---|---|
Endereço | Estado | |||
– | – | #00FF0E | – | 1 byte |
– | – | #00FF0D | – | 1 byte |
– | – | #00FF0C | reservado | 1 byte |
– | – | #00FF0B | reservado | 1 byte |
– | – | #00FF0A | reservado | 1 byte |
int | sum | #00FF09 | reservado | 1 byte |
– | – | #00FF08 | reservado | 1 byte |
– | – | #00FF07 | reservado | 1 byte |
– | – | #00FF06 | reservado | 1 byte |
int | numB | #00FF05 | reservado | 1 byte |
– | – | #00FF04 | reservado | 1 byte |
– | – | #00FF03 | reservado | 1 byte |
– | – | #00FF02 | reservado | 1 byte |
int | numA | #00FF01 | reservado | 1 byte |
Fonte: Autor.
Uma função de um programa é representada numa pilha de memória da seguinte forma:
Variáveis |
Parâmetros |
Retorno |
Adotemos como exemplo uma função para a soma de duas variáveis em linguagem C e o comportamento da memória (Tabela 02):
Tabela 02 – Pilha de Memória na Alocação Estática de uma função para a soma de duas variáveis em linguagem C.
Tipo | Nome | Pilha | Tamanho | |
---|---|---|---|---|
Endereço | Estado | |||
– | – | #00FF10 | reservado | 1 byte |
– | – | #00FF0F | reservado | 1 byte |
– | – | #00FF0E | reservado | 1 byte |
int | sum | #00FF0D | reservado | 1 byte |
– | – | #00FF0C | reservado | 1 byte |
– | – | #00FF0B | reservado | 1 byte |
– | – | #00FF0A | reservado | 1 byte |
int | numB | #00FF09 | reservado | 1 byte |
– | – | #00FF08 | reservado | 1 byte |
– | – | #00FF07 | reservado | 1 byte |
– | – | #00FF06 | reservado | 1 byte |
int | numA | #00FF05 | reservado | 1 byte |
– | – | #00FF04 | reservado | 1 byte |
– | – | #00FF03 | reservado | 1 byte |
– | – | #00FF02 | reservado | 1 byte |
int | – | #00FF01 | reservado | 1 byte |
Fonte: Autor.
Assim, é possível calcular a quantidade de memória que uma função necessita para ser executada:
Quantidade de memória = Retorno + Parâmetros + Variáveis
Quantidade de memória = 4 Bytes + ( 4 Bytes + 4 Bytes ) + 4 Bytes = 16 Bytes
Uma vez que uma função é finalizada, os bytes da pilha referentes a ela na memória são liberados para o armazenamento de outros dados na memória, ou seja, o tempo de vida do espaço reservado de memória alocado estaticamente é igual ao tempo de vida de execução da função ou bloco.
tempo de vida do espaço de memória = tempo de vida de execução
Isso significa que qualquer variável declarada será alocada no início da função e desalocada no final da função, independente do momento em que se vai utilizar a variável declarada.
Outra característica da alocação estática é a de que o tamanho do espaço de memória alocado para uma função será definido durante o tempo de compilação, ou seja, o compilador irá avaliar a escrita de seu código e determinar a quantidade exata que o código necessita para cada função.
Isso significa que não é possível alterar o tamanho de uma função após a compilação de um programa. Para tal, será necessário alterar o código e recompilar a função em que se deseje alterar o seu tamanho.
Referências
- PIVA JÚNIOR, Dilermando (et al). Estrutura de dados e técnicas de programação. 1. ed. Rio de Janeiro, RJ: Campus, 2014. 399 p. ISBN: 9788535274370.
- CORMEN, Thomas H et al. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 926 p. ISBN: 9788535236996.
- TOSCANI, Laira Vieira; VELOSO, Paulo A. S. Complexidade de algoritmos: análise, projeto e métodos. 3. ed. Porto Alegre: Bookman, 2012. 261 p. (Série livros didáticos informática UFRGS, 13) ISBN: 9788540701380.
- ASCENCIO, Ana Fernanda Gomes. Estruturas de dados: algoritmos, análise da complexidade e implementações em Java e C/C++. São Paulo: Pearson, c2010. 432 p. ISBN: 9788576052216, 978857605816.
- BRASSARD, Gilles; BRATLEY, Paul. Fundamentals of algorithmics. Englewood Cliffs: Prentice Hall, c1996. xx, 524 p. ISBN: 0133350681.