[ LOW-LEVEL ] Memória: Stack e Heap
Alocação de memória, memória, em geral, no computador, é algo que sempre tive vontade de estudar. Um dos assuntos que eu era ansioso para estudar mas eu sempre procastinava esse estudo.
Segui este link que foi disponibilizado pelo @maniero, e me rendeu (ainda redendendo) vários dias de leitura e anotações. Acho que posso chamar isso de estudo.
Bem, o objetivo aqui é explicar o que eu entendi sobre o assunto e, consequentemente, aprender tanto ensinando, quanto vocês também podem me corrigir em algo que eu errar aqui - inclusive eu peço que deixe as suas conclusões sobre a minha visão deste assunto.
Stack
Traduzinho do inglês, significa pilha. Pilha porque é a forma que os dados são armazenados aqui, usando o método LIFO - last in, first out; último a entrar, primeiro a sair. Ou seja, os dados aqui são sempre colocados no topo e os dados removidos são sempre os do topo.
A Stack é conhecida por sua alocação automática, já que, ela mesma faz alocação e também a desalocação, fazendo com que a única preocupação do programador seja fornecer o dado a ser associado.
O seguinte código é em C:
int x = 1;
Isso é uma simples alocação na Stack, onde é pego um espaço na memória (o topo da Stack) e armazeno o dado.
Pontos a serem destacados:
- Stacks estão dentro de threads. Cada thread no seu programa possui uma Stack.
- Os dados são empilhados. Logo, podemos dizer que os dados são sequenciais
- Não é recomendado armazenar dados de grandes tamanhos, podendo causar o famoso stack overflow
- É usado um ponteiro - stack pointer - para alocar e desalocar dados
- Os dados que são armazenados na Stack podem ser: retorno de funções, paramêtros de funções e variáveis locais
- A desalocação é feita no término do programa, ou seja, de forma automática
Antes de ir pro Heap, quero explicar melhor o 2° ponto, quando disse:
"Os dados são empilhados. Logo, podemos dizer que os dados são sequenciais"
Quis dizer que o seguinte é possível:
int variable_1 = 1;
int variable_2 = 2;
int *pointer = &variable_1; // pega o endereço de 'variable_1'
printf("variable_1 = %d", *pointer); // output: variable_1 = 1
printf("variable_2 = %d", *(pointer + 1)); // output: variable_2 = 2
Heap
Heap, diferente da Stack, não possui um modelo. O que quer dizer que ele não possui bem uma "ordem" de alocar os dados nem de remover/desalocar.
O Heap é flexível. Mas, por não possuir um padrão/modelo de alocação e desalocação, acaba que o Heap perde enficiência.
Também chamado de dinâmico, já que é possível alocar e desalocar durante a excução do programa. Ou seja, é possível pedir para o usuário informar o tamanho do dado e armazenar um espaço na memória a partir desse dado fornecido pelo usuário - mesmo que não seja tão eficiente.
Ficaria assim, em C:
void alocar_com_heap(int tamanho_do_dado) {
int *num = malloc(sizeof(int) * tamanho_do_dado); // reservando um espaço na memória
*num = 1;
printf("num = %d", *num); // output: num = 1
}
Tá certo. E pra liberar uma memória no Heap, como faz?
Tem as seguintes formas:
- Forma manual
- Garbage Collector - estudando
Bem, no C, o recomendando é sempre usar free()
- que seria a forma manual - para não acontecer nenhum vazamento de memória, ou seja, a memória continua alocada mesmo após o término do programa.
Então, para completar o código de lá de cima:
void alocar_com_heap(int tamanho_do_dado) {
int *num = malloc(sizeof(int) * tamanho_do_dado); // reservando um espaço na memória
*num = 1;
printf("num = %d", *num); // output: num = 1
free(num); // liberando a reserva no heap
}
Conclusão
A minha visão sobre o assunto é essa.
Faz pouco tempo que eu estou estudando - comecei na segunda - então, a ideia ainda vai "amadurecer" na minha mente.
Também quero que esse post sirva de incentivo para você que está no início da aprendizagem em programação (eu já tenho um bom tempo que tento estudar sobre a área, então não estou tão no início) para que aprenda mais sobre a base, conceitos low-level.
Quero destacar o seguinte: eu aprendi, deixei mais claros alguns conceitos sobre este assunto só de escrever este post. Fica aí a dica.
Assuntos para Estudo:
Tem vários assuntos que não foram abordados aqui, e o porquê disso é que o assunto ainda está sendo processado pela minha mente. Ou, simplesmente, ainda estou estudando. risos.
Alguns deles:
Estude todo dia um pouco. Isso funciona de verdade.