Diferença entre Heap e Stack em C++
Antes de mais nada, esse post tem como objetivo iniciar uma discussão sobre esse assunto e possivelmente tirar umas dúvidas da galera que, assim como eu, ta estudando C++ seja na faculdade ou por conta própria. Então fico feliz com toda e qualquer interação/sugestão.
O que é Heap e Stack?
Heap e Stack são partes da memória que é alocada (memory allocation) para poder rodar nossas aplicações, memória essa que é utilizada pra guardar informações necessárias para a solução, sejam elas variáveis ou arquivos que o programa deverá ler para executar o que ele precisa executar.
Dito isso, uma das diferênças entre essas partes é em como elas vão nos dar a informação que procuramos durante a parte de memory allocation, fazendo com que a solução fique mais pesada ou mais lenta se forem usadas de maneira equivocada.
Vendo pela nomeclatura, alocação em Stack (Stack Allocation) nos remete a alocação em Pilha. O que isso significa? Justamente o que diz na estrutura de dados: é uma pilha de memória sendo alocada uma após a outra, do tamanho exato que é necessário para que o programa funcione, e isso ocasiona que esse tipo de alocação seja extremamente rápido e além disso, toda a memória que foi separada em Stack, no momento em que o programa sai do escopo em que ela foi alocada, é instantâneamente liberada, tornando esse tipo de alocação também muito eficiente.
Beleza, mas como que é a diferença entre esses dois tipos de alocação em código?
Um ponto bem nítido de quando algo é alocado no Heap é o uso da keyword new
, já quando é alocado no Stack, é uma declaração convencional rvalue = lvalue
.
Exemplo:
int main()
{
// Isso é uma alocação na Stack
int value = 1;
int* pValue = &value;
// Isso é uma alocação no Heap
int* hValue = new int;
*hValue = 5;
std::cin.get();
}
Pelo fato de utilizarmos a keyword new
, ou malloc
(Memory Allocation) na alocação no Heap, torna-se necessário que essa memória seja manualmente liberada assim que for terminado o seu uso, com o uso da keyword delete
.
Conclusão
Por fim, pelo o que entendi, é preciso evitar ao máximo a alocação de memoria em Heap pois pode causar um custo de execução maior pra solução quando utilizada equivocadamente.