C++ essayer/lancer/attraper => code machine
Mentalement, je me suis toujours demandé comment essayer/lancer/attraper jette un regard derrière les coulisses, lorsque le C++ compile traduit en assembleur. Mais depuis je ne l'utilise jamais, je n'ai jamais eu le temps de le vérifier (certains diraient paresseux).
Est normal de pile utilisé pour garder une trace de try
s, ou est séparé par pile de thread gardé pour cette seule fin? Est la mise en œuvre entre MSVC et g++, grand ou petit? Merci de me montrer une pseudo asm (IA-32 est ok aussi) donc je n'ai jamais eu à le vérifier moi-même! 🙂
Edit: Maintenant, je reçois les bases de MSVC est mise en œuvre sur IA-32 manipulation. Quelqu'un sait pour g++ sur IA-32, ou de toute autre CPU pour que la matière?
Vous devez vous connecter pour publier un commentaire.
Microsoft Revue "Sous le Capot" de la série a fait un regard en profondeur sur ce sujet en 1997:
Un Cours intensif sur les Profondeurs de Win32™ la gestion Structurée des exceptions
Pauvres implémentations de gestionnaires d'exceptions pousser une sorte de bloc de gestionnaire d'exceptions pour chaque essai, clause relative à l'exécution de la pile comme l'essai, la clause est entré, et de la pop comme les essayer clause est sorti. Un emplacement en tenant l'adresse de la plus récemment poussé gestionnaire d'exception bloc est également maintenue. Généralement, ces gestionnaires d'exception sont enchaînés, de sorte qu'ils peuvent être trouvé en suivant les liens de la plus récente à des versions plus anciennes. Lorsqu'une exception se produit, un pointeur vers le dernier-poussé HEIN gestionnaire de bloc est trouvé, et le traitement de ce "essayer" de la clause HEIN cas est vérifié. Un coup sur un HEIN cas, les causes de la pile de nettoyage à se produire de nouveau au point de pousser HEIN, et le contrôle des transferts de l'HEIN cas. Pas de coups sur la HEIN la prochaine HEIN, et le processus se répète. Les 32 bits de Windows SEH régime est une version de ce.
C'est une mauvaise mise en œuvre, car le programme de paie à l'exécution de prix pour chaque essai, la clause (pousser puis pop), même si aucune exception ne se produit.
Bonnes implémentations simplement d'enregistrer une table de plages où essayer des clauses de se produire. Cela signifie qu'il n'y aucun frais généraux pour entrer/sortir d'un essai de la clause. (Mon PARLANSE parallèle de la programmation de langue utilise cette technique). Une exception semble que le PC de l'exception point dans le tableau, et passe le contrôle à la HEIN sélectionné par la table. EH code réinitialise la pile appropriée. Rapide et jolie.
Je pense que le 64 bits de Windows HEIN est de ce type, mais je n'ai pas regardé attentivement.
C'est un très précieux article sur le sujet:
Comment un compilateur C++ implémente la gestion des exceptions
La norme C++ comité a publié un rapport technique sur "les performances de C++" pour démystifier beaucoup de mythes au sujet de la façon dont des fonctionnalités C++ soi-disant vous ralentir. Cela comprend également des détails sur la façon dont la gestion des exceptions pourraient être mises en œuvre. Le projet de ce rapport technique est disponible gratuitement. Vérifiez la section 5.4.1. "La gestion des exceptions Questions de mise en Œuvre et les Techniques".
Ont un coup d'oeil à ce document qui décrit le fonctionnement interne de la gestion des exceptions assez bien.
Asm de le Godbolt compilateur explorer, pour le x86-64 V convention d'appel avec g++8.2 de l'ABI C++, une fonction qui attire, et qui en jette.
x86-64 V utilise le
.eh_frame
section de cheminée-détendez-vous des métadonnées, de sorte que l'exception aide des fonctions de la bibliothèque sais comment marche la pile et de restauration des registres. C'est ce que.cfi
les directives.