Les programmeurs peuvent avoir des questions sur les trames de pile non pas dans un sens large (qu'il s'agit d'une entité unique dans la pile qui sert un seul appel de fonction et conserve l'adresse de retour, les arguments et les variables locales) mais au sens étroit - lorsque le terme stack frames
est mentionné dans contexte des options du compilateur.
Que l'auteur de la question le veuille ou non, mais le concept d'un cadre de pile du point de vue des options du compilateur est une question très importante, non couverte par les autres réponses ici.
Par exemple, le compilateur C / C ++ Microsoft Visual Studio 2015 a l'option suivante liée à stack frames
:
- / Oy (Omission Frame-Pointer)
GCC dispose des éléments suivants:
- -fomit-frame-pointer (Ne pas conserver le pointeur de trame dans un registre pour les fonctions qui n'en ont pas besoin. Cela évite les instructions pour enregistrer, configurer et restaurer les pointeurs de trame; cela rend également un registre supplémentaire disponible dans de nombreuses fonctions )
Le compilateur Intel C ++ possède les éléments suivants:
- -fomit-frame-pointer (Détermine si EBP est utilisé comme registre à usage général dans les optimisations)
qui a l'alias suivant:
Delphi a l'option de ligne de commande suivante:
- - $ W + (Générer des cadres de pile)
Dans ce sens spécifique, du point de vue du compilateur, un cadre de pile n'est que le code d'entrée et de sortie de la routine , qui pousse une ancre vers la pile - qui peut également être utilisée pour le débogage et pour la gestion des exceptions. Les outils de débogage peuvent analyser les données de la pile et utiliser ces ancres pour le retour en arrière, tout en les localisant call sites
dans la pile, c'est-à-dire pour afficher les noms des fonctions dans l'ordre où elles ont été appelées hiérarchiquement. Pour l'architecture Intel, c'est push ebp; mov ebp, esp
soit enter
pour l'entrée et mov esp, ebp; pop ebp
soit leave
pour la sortie.
C'est pourquoi il est très important de comprendre pour un programmeur ce qu'est un cadre de pile en ce qui concerne les options du compilateur - car le compilateur peut contrôler s'il faut générer ce code ou non.
Dans certains cas, le cadre de pile (code d'entrée et de sortie pour la routine) peut être omis par le compilateur, et les variables seront directement accessibles via le pointeur de pile (SP / ESP / RSP) plutôt que le pointeur de base pratique (BP / ESP / RSP). Conditions d'omission du cadre de pile, par exemple:
- la fonction est une fonction feuille (c'est-à-dire une entité finale qui n'appelle pas d'autres fonctions);
- il n'y a pas de constructions try / finally ou try / except ou similaires, c'est-à-dire qu'aucune exception n'est utilisée;
- aucune routine n'est appelée avec des paramètres sortants sur la pile;
- la fonction n'a pas de paramètres;
- la fonction n'a pas de code d'assemblage en ligne;
- etc...
L'omission de trames de pile (code d'entrée et de sortie pour la routine) peut rendre le code plus petit et plus rapide, mais cela peut également affecter négativement la capacité des débogueurs à retracer les données de la pile et à les afficher au programmeur. Ce sont les options du compilateur qui déterminent dans quelles conditions une fonction doit avoir le code d'entrée et de sortie, par exemple: (a) toujours, (b) jamais, (c) si nécessaire (en spécifiant les conditions).