Memory & Span
Stack vs Heap, Span<T>, ReadOnlySpan<T>, Memory<T> e parsing zero-allocation
Regra de ouro: Span<T> e ReadOnlySpan<T> vivem apenas na stack (ref struct). Nunca podem ser campos de classes, boxed ou usados em async/await. Para o heap, use Memory<T>.
Stack vs Heap
| Aspecto | Stack | Heap |
|---|---|---|
| Quem aloca | Compilador (automatico por frame) | Runtime / GC (new, boxing) |
| Quem libera | Automatico ao sair do metodo | Garbage Collector |
| O que vive la | Value types locais, parametros, ponteiros de retorno | Objetos (class), arrays, strings, boxed values |
| Performance | Muito rapida - move stack pointer | Depende do GC - pode causar pausas |
| Tamanho tipico | ~1 MB por thread | Limitado pela RAM |
| Lifetime | Escopo do metodo | Enquanto houver referencia (GC decide) |
Value Types vs Reference Types
| Tipo | Exemplos | Onde mora | Copia |
|---|---|---|---|
| Value Type | int, bool, double, struct, enum | Stack (se local) ou inline no objeto | Copia o valor inteiro |
| Reference Type | class, string, object, array, delegate | Heap (referencia na stack) | Copia apenas a referencia |
stackalloc - buffer na stack
// stackalloc cria buffer na stack - sem GC
Span<byte> buffer = stackalloc byte[256];
buffer[0] = 0xFF;
// buffer e liberado automaticamente ao sair do metodo
// Use para buffers pequenos (<= poucos KB)
// Buffers grandes causam StackOverflowException
Span<int> numbers = stackalloc int[4] { 10, 20, 30, 40 };
Console.WriteLine(numbers[2]); // 30
stackalloc cria um buffer direto na stack - sem GC, sem alocacao no heap. Ideal para buffers pequenos e temporarios (<= poucos KB). O buffer e liberado automaticamente ao sair do escopo.
Como funciona stackalloc?
stackalloc reserva N bytes no stack frame do metodo atual. Nao passa pelo GC. O buffer e liberado quando o metodo retorna (stack pointer volta). Use para buffers pequenos e de curta duracao. Se o buffer for grande demais, causa StackOverflowException.