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.
- 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.
- 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.
- A função chamada aloca espaço na memória para suas variáveis
locais.
- O corpo da função chamada é executado.
- 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. 
Armando Luiz Nicolini Delgado
2020-10-20