Sobes.tech
Junior

Qual é a diferença entre uma pilha e um monte?

sobes.tech IA

Resposta da IA

A pilha (Stack) e o heap (Heap) são duas áreas de memória usadas para armazenar dados em programas.

Stack:

  • Usada para armazenar variáveis locais e endereços de retorno de funções.
  • Funciona pelo princípio LIFO (Last In, First Out - último a entrar, primeiro a sair).
  • Gestão de memória automática: a memória é alocada ao entrar na função e liberada ao sair.
  • Mais rápida que o heap devido à simplicidade de gestão e à localidade dos dados.
  • O tamanho é fixo ou limitado, podendo ocorrer overflow de pilha (stack overflow).

Heap:

  • Usado para alocação dinâmica de memória de objetos que podem permanecer na memória após sair da função atual.
  • Gestão de memória manual (através de malloc/free em C/C++) ou automática (ARC/Garbage Collection/Ownership em Swift/Rust).
  • Mais lento que a pilha devido à gestão de memória mais complexa e possíveis fragmentações.
  • O tamanho é mais flexível e limitado apenas pela memória do sistema disponível.
  • Pode ocorrer vazamento de memória se a memória alocada não for liberada.

Comparação:

Característica Pilha Heap
Princípio de funcionamento LIFO Sem ordem definida
Gestão de memória Automática Manual ou automática (ARC/GC/Ownership)
Velocidade Mais rápida Mais lenta
Uso Variáveis locais, endereços de retorno Objetos alocados dinamicamente, tipos de referência
Tamanho Fixo / Limitado Flexível
Problemas possíveis Overflow de pilha Vazamento de memória, fragmentação

Em Swift, os Tipos de Valor (por exemplo, struct, enum, tipos básicos como Int, Bool) geralmente são armazenados na pilha, enquanto os Tipos de Referência (por exemplo, class, closure) no heap. Variáveis, mesmo de tipos de referência, podem ser armazenadas na pilha graças a certas otimizações do compilador (escape analysis).