Skip to content
Latchkey

O que é o Stack? Memória para chamadas de função

O stack é uma região de memória que cresce e encolhe conforme funções são chamadas e retornam, armazenando variáveis locais e bookkeeping em ordem last-in, first-out.

Toda vez que seu programa chama uma função, ele empilha um "stack frame" contendo as variáveis locais daquela chamada, os argumentos e para onde retornar. Quando a função retorna, seu frame é desempilhado. Essa disciplina last-in, first-out torna o stack extremamente rápido, mas também de tamanho fixo, e é por isso que uma recursão profunda ou descontrolada pode transbordá-lo.

Como o call stack funciona

Uma chamada de função empilha um frame; um retorno o desempilha. O frame guarda variáveis locais, parâmetros e o endereço de retorno. Como a alocação é apenas mover um ponteiro, as operações do stack são quase gratuitas, muito mais baratas do que a alocação no heap.

Stack vs heap

O stack armazena dados de vida curta, com escopo de função, em ordem estrita e é limpo automaticamente no retorno. O heap armazena dados de vida mais longa e tamanho dinâmico, gerenciados manualmente ou por um garbage collector. A maioria dos programas usa os dois o tempo todo.

O que vive no stack

  • Variáveis locais das funções em execução no momento.
  • Argumentos de função passados por valor.
  • Endereços de retorno para que a execução possa continuar após uma chamada.
  • Registradores salvos e pequenos dados de bookkeeping.

Por que o stack é limitado

O stack tem um tamanho máximo fixo definido pelo OS ou pelo runtime. Cada chamada consome parte dele, e frames só são liberados no retorno. Recursão sem limite continua empilhando frames até o limite ser atingido, produzindo um stack overflow.

Um exemplo rápido

Uma função que chama a si mesma sem caso base empilha um novo frame a cada chamada e nunca retorna, então o stack cresce até transbordar e o programa trava com um erro de stack overflow.

O stack no CI

Stack overflows normalmente apontam para um bug de lógica (recursão ruim), então são determinísticos e um retry não vai ajudar. O CI costuma ser onde eles aparecem primeiro. Uma plataforma gerenciada como a Latchkey distingue crashes determinísticos de falhas transitórias de infraestrutura, dando retry apenas nas últimas para que bugs reais ainda apareçam.

Principais conclusões

  • O stack armazena chamadas de função e locais em ordem last-in, first-out e é muito rápido.
  • Ele tem tamanho fixo, então recursão profunda ou infinita o transborda.
  • Stack overflows são bugs de lógica determinísticos, não falhas transitórias para dar retry.

Guias relacionados