47 votes

C ++ try / throw / catch => 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).

C'est la normale de la pile utilisé pour garder une trace de trys, 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?

26voto

Ira Baxter Points 48153

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.

16voto

AraK Points 38702

Ceci est un article très précieux sur le sujet: Comment un compilateur C ++ implémente la gestion des exceptions

10voto

Remy Lebeau Points 130112

La série "Under the Hood" de Microsoft Journal a examiné ce sujet en profondeur en 1997:

Un cours intensif sur les profondeurs de la gestion structurée des exceptions Win32 ™

5voto

sellibitze Points 13607

Le comité de normalisation C ++ a publié un rapport technique sur les "performances C ++" afin de dissiper de nombreux mythes sur le fait que les fonctionnalités C ++ sont censées vous ralentir. Cela inclut également des détails sur la manière dont la gestion des exceptions peut être implémentée. Le projet de ce rapport technique est disponible gratuitement. Vérifiez la section 5.4.1. "Problèmes et techniques de mise en œuvre de la gestion des exceptions".

0voto

steve Points 3500

Jetez un coup d’œil à ce document qui décrit assez bien les aspects internes de la gestion des exceptions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X