Executando verificação de segurança...
2

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.

Carregando publicação patrocinada...
3
2

Pode ajudar.

Eu acho que as respostas do SOen, especialmenet a aceita, não muito boas, apesar de certas, pode levar a entendimento errado pela simplificação, a aceita beira ao erro de tão simples, porque ser incompleto pode ser errado.

E é importante notar que isso não é exclusivo de C++. Na verdade C e C++ nem definem isso na especificação. Embora na prática seja quase impossível fazer o que está lá sem stack e heap, não é algo formalmente especificado.

Também seria bom deixar claro que malloc() é uma função, e em C++ evita-se bastante seu uso.

Não há garantias que o new aloca no heap. E, uma atribuição pode fazer muita coisa diferente. Essa é até uma das críticas que se faz ao C++, embora seja uma feature poderosa também, porque o mundo não é maniqueísta.

Eu até acho que afirmar que deve-se evitar ao máximo a alocação no heap não seja um erro absurdo, mas em modo pedante on (algumas pessoas adoram... quem? eu?!?!?! :D), de fato pode dar uma ideia errada para quem lê. Fica parecendo uma resposta do ChatGPT, quem não entende do assunto pode aprender errado. Sendo hiper pedante, "evitar" me parece um termo bom, mas que muitas pessoas vão interpretar errado por causa do "ao máximo".

O próprio uso de "partes da memória" pode levar a algo que dê entendimento errado, mas chega de ser pedante por hoje :D


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1