16 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.

Armando Luiz Nicolini Delgado
2013-10-21