2009-08-25 11 views
33

Mentalement, je me suis toujours demandé comment try/throw/catch regarde en coulisses, quand les compilations C++ le traduisent en assembleur. Mais puisque je ne l'utilise jamais, je n'ai jamais eu le temps de le vérifier (certaines personnes diraient paresseux).C++ try/throw/catch => code machine

La pile normale est-elle utilisée pour garder la trace de try s, ou est-ce qu'une pile séparée par thread est conservée à cette seule fin? L'implémentation entre MSVC et g ++ est-elle grande ou petite? S'il vous plaît montrez-moi un pseudo asm (IA-32 est ok aussi) donc je ne dois jamais vérifier moi-même! :)

Modifier: Maintenant, je reçois les bases de l'implémentation de MSVC sur la gestion IA-32. Quelqu'un sait-il pour g ++ sur IA-32, ou tout autre processeur d'ailleurs?

Répondre

7

série « Sous le capot » Microsoft Journal a fait un examen approfondi à ce sujet très en 1997:

A Crash Course on the Depths of Win32™ Structured Exception Handling

+0

Cela couvre la gestion des exceptions structurées Windows, qui est liée à la gestion des exceptions C++, mais pas la même chose.Pietrek mentionne dans l'introduction que les exceptions C++, telles qu'implémentées par Microsoft et Borland, utilisent SEH, mais que son article ne couvre pas * comment * elles l'implémentent. –

+0

Grand article MSVC/IA-32, bien que long. –

+1

Les exceptions C++ sont juste une classe d'exceptions SEH, avec un wrapper pour inclure les informations C++ (l'instance de classe d'exception). Les exceptions C++ doivent utiliser SEH pour propager les limites du noyau, etc. –

15

Ceci est un article très précieux sur le sujet: How a C++ compiler implements exception handling

+1

Cet article a été publié en 2002 ... est-il vraiment à jour? – Klaim

+0

J'ai pris un aperçu il y a longtemps. Je ne suis pas vraiment sûr que ce soit à jour. – AraK

+13

2002 est assez récent par les normes C++ – Javier

0

Jetez un oeil à this document qui décrit le fonctionnement interne de la gestion des exceptions assez bien.

18

implémentations pauvres des gestionnaires d'exceptions poussent une sorte de bloc de gestionnaire d'exceptions pour chaque essai clause sur la pile d'exécution que la clause try est entrée, et le retirer lorsque la clause try est quitté. Un emplacement contenant l'adresse du bloc du gestionnaire d'exceptions le plus récemment poussé est également conservé. Généralement, ces gestionnaires d'exceptions sont chaînés ensemble, ce qui permet de les retrouver en suivant les liens des versions les plus récentes vers les versions plus anciennes. Lorsqu'une exception se produit, un pointeur vers le bloc du gestionnaire EH le plus avancé est trouvé et le traitement des cas EH de la clause "try" est vérifié. Un hit sur un cas EH provoque le nettoyage de la pile au retour de l'EH et contrôle les transferts vers le cas EH. Aucun résultat sur l'EH ne permet de trouver le prochain EH et le processus se répète. Le schéma SEH Windows 32 bits est une version de ceci.

Il s'agit d'une mauvaise implémentation car le programme paie un prix d'exécution pour chaque clause try (push puis pop) même lorsqu'aucune exception ne se produit.

De bonnes implémentations enregistrent simplement une table de plages où des clauses try se produisent. Cela signifie qu'il n'y a pas de surcharge pour entrer/sortir une clause try. (Ma PARLANSE programmation parallèle langauge utilise cette technique). Une exception recherche le PC du point d'exception dans la table et transmet le contrôle à l'EH sélectionné par la table. Le code EH réinitialise la pile le cas échéant. Rapide et joli. Je pense que le Windows 64 bits EH est de ce type, mais je n'ai pas regardé attentivement.

3

Le comité de normalisation C++ a publié un rapport technique sur les «performances C++» pour démystifier de nombreux mythes sur la façon dont les fonctionnalités C++ vous ralentiraient. Cela inclut également des détails sur la façon dont la gestion des exceptions pourrait être implémentée. Le draft de ce rapport technique est disponible gratuitement. Vérifier la section 5.4.1. "Problèmes et techniques de mise en œuvre du traitement des exceptions".