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/freeem 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).