2010-03-26 9 views
3

Je lis la pensée en C++ (vol 2.):parent statique et dynamique Une fonction

Chaque fois qu'une fonction est appelée, informations sur cette fonction est poussé sur la pile d'exécution dans une activation instance d'enregistrement (ARI), également appelé un cadre de pile. Une pile typique trame contient (1) l'adresse de la fonction d'appel (si l'exécution peut retour à lui), (2) un pointeur sur l'IRA de parent statique de la fonction (la portée qui contient lexicalement la appelée fonction, donc des variables globales à la fonction peut être consulté), et (3) un pointeur sur la fonction qui a appelé il (son parent dynamique). Le chemin qui résultats logiquement répétitivement suivant les liens parents dynamiques est la chaîne dynamique, ou d'une chaîne d'appel

Je suis incapable de comprendre ce que signifie l'auteur en tant que parent statique et dynamique de la fonction. Je ne suis pas non plus en mesure de faire la différence entre les articles 1, 2 ou 3. Ils semblent tous être les mêmes. Quelqu'un peut-il m'expliquer ce passage?

+0

Tout ce que je peux voir est un appelant et un appelé. Et aussi je sais qu'une fois que l'appelé revient, la pile d'appel est sautée une fois (déroulée) et ceci mène au pointeur de cadre pour décrémenter et pointer vers la fonction parent (appelant). – legends2k

Répondre

2

Tout cela me semble très étrange. Les pointeurs de cadres statiques sont normalement utilisés dans les langages à portée lexicale, tels que les langages fonctionnels, et la famille pascal avec leurs fonctions imbriquées. Les globaux sont liés une seule fois au moment de la compilation ou de l'exécution et ne doivent pas avoir besoin de pointeurs d'image. (1) est valide, mais (2) n'existe pas en C++, AFAIK.

Je soupçonne que (3) était destiné à se référer au pointeur de trame parent. Les piles d'appels sont généralement configurées en tant que listes chaînées afin que les débogueurs et les outils associés puissent les parcourir sans nécessiter une connaissance approfondie du programme.

4

Je pense que cette déclaration ne concerne pas C++ mais la structure générale de la trame de la pile. 1) est l'adresse de retour - adresse de l'instruction après call dans la fonction principale. lorsque le retour est effectué, il sera pop éd à partir de la pile et l'exécution ira à ce point (valide pour C++) 2) et 3) sont valables pour les langues qui permettent des fonctions imbriquées. (Fonction déclarée à l'intérieur de la fonction) de telles fonctions peuvent avoir accès aux variables parent, donc elles ont un lien (lien statique) vers la pile de parent et le lien dynamique est pour que ces fonctions puissent s'appeler récursivement