Stack, heap e boxing
ResumoTipos de valor tendem a viver na stack (rápida, automática); objetos de referência vivem no heap (gerenciado pelo GC). Boxing é embrulhar um value type em um objeto no heap — barato de errar, caro em desempenho.
1. Objetivos de Aprendizagem#
- Entender o papel de stack e heap.
- Reconhecer o que é boxing/unboxing e seu custo.
- Ter noção de como o Garbage Collector atua.
2. Pré-requisitos#
- Struct vs class (tópico 4.1).
3. Conceito#
- Stack: região de memória rápida, organizada por chamadas de método. Variáveis locais de tipos de valor costumam ficar aqui; são liberadas ao sair do método.
- Heap: região onde vivem os objetos de referência. É gerenciada pelo Garbage Collector (GC), que libera automaticamente o que não é mais referenciado.
- Boxing: quando um value type (
int,struct) é convertido paraobject(ou uma interface), o runtime o embrulha num objeto no heap. Unboxing é o caminho de volta.
O porquê de se importar: boxing em laços quentes gera lixo (pressão no GC) e custa desempenho. Generics existem em parte para evitá-lo.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Memoria
cd Catalog.Memoria
4.2. Implementação Passo a Passo#
- Boxing implícito (evite):
int numero = 42;
object caixa = numero; // BOXING: cópia vai para o heap
int devolta = (int)caixa; // UNBOXING
- Coleção não genérica força boxing (não use):
// Evitar: System.Collections.ArrayList faz boxing de cada int
var lista = new System.Collections.Generic.List<int>(); // sem boxing
lista.Add(1);
string.Format/interpolação também podem "boxar" value types passados comoobject.
4.3. Executando#
dotnet run
5. Exemplo Completo#
Usar List<int> (genérico) em vez de ArrayList (não genérico) elimina boxing de cada elemento — mesma lógica, muito menos lixo no heap.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
Usar coleções genéricas (List) | Coleções não genéricas (ArrayList) que fazem boxing |
| Deixar o GC trabalhar; escrever código limpo | Micro-otimizar memória sem medir |
Notao modelo "value = stack, reference = heap" é uma simplificação didática. Um value type dentro de um objeto de referência mora no heap junto com ele. Para o dia a dia, o essencial é entender cópia vs referência e evitar boxing desnecessário.
7. Segurança e Produção#
- Alocações excessivas no heap aumentam a frequência de coletas do GC e podem causar picos de latência em serviços de alta carga. Meça com ferramentas de profiling antes de otimizar.
8. Exercícios#
- Fácil: identifique o boxing no exemplo e explique-o.
- Médio: troque um
ArrayListporList<int>e descreva o ganho. - Desafio: pesquise o que é o GC geracional (gen 0/1/2) e resuma em 3 linhas.
9. Resumo#
Value types tendem à stack; objetos vivem no heap sob o GC. Boxing embrulha value types no heap e custa desempenho — coleções genéricas o evitam.
10. Próximos Passos#
A seguir, lidar com ausência de valor: nullable.
11. Referências#
- Microsoft Learn — Boxing e unboxing
- Microsoft Learn — Fundamentos do Garbage Collector
- Microsoft Learn — Coleções genéricas