24 Ativação de função

Uma função começa sua execução assim que for chamada. Cada execução da função é chamada de ativação da função. Como já mencionamos em notas de aula anteriores, variáveis locais são locais a ativação da função: cada ativação possui suas próprias variáveis locais. No começo da ativação, memória é alocada para as variáveis locais e no final da execução, elas são dealocadas.

Definições de funções em C++ não podem ser aninhadas, mas ativações de função podem: uma função, digamos A, pode chamar uma outra função, digamos B (dizemos que A chama B). Nos referimos a A como o “chamador” e B como a função “chamada”.

O que acontece quando uma função chama outra (quando A chama B)? Um registro especial, chamado registro de ativação é criado. A informação neste registro é necessária para a ativação da função chamada e para a reativação do chamador depois que a execução da função chamada termina.

  1. C++ usa chamada-por-valor, ou seja, o chamador avalia as expressões que são os parâmetros reais e passa seus valores para a função chamada.
  2. A informação necessária para reiniciar a execução da função chamadora é guardada em um registro de ativação. Tal informação inclui o endereço da instrução do chamador que será executada depois que a função chamada termine.
  3. A função chamada aloca espaço na memória para suas variáveis locais.
  4. O corpo da função chamada é executado.
  5. O valor retornado para a função chamadora através de um return é colocado em um lugar especial para que a função chamadora possa encontrá-lo. O controle retorna a função chamadora.

O fluxo de controle através de ativação de funções é da forma último-que-entra-primeiro-que-sai. Se A chama B e B chama C: A é ativado primeiro, então B é ativado (um registro de ativação para “A chama B” é criado e armazenado, A é temporariamente suspenso), então C é ativado (um registro de ativação de “B chama C” é criado e armazenado, A e B são suspensos); C é o último a iniciar execução, mas o primeiro a terminar (último-a-entrar-primeiro-a-sair). Depois que C termina, B é reativado. O registro de ativação “B chama C” foi criado por último, mas o primeiro a ser destruído (no momento que o controle é retornada para B). Depois que B termina, A é reativado. O registro de ativação correspondente a “A chama B” é destruído no momento em que o controle retorna para A.


Créditos: Documento produzido pelo Prof. Armando L.N. Delgado (DINF/ET/UFPR), baseado em revisão sobre material de Prof. Carmem Hara e Prof. Wagner Zola (DINF/ET/UFPR).

Esta obra está licenciada com uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional.  Licença Creative Commons

Armando Luiz Nicolini Delgado
2020-10-20