Exception des modèles de gestion de la GCC
GCC supporte Setjump-longjump (sjlj) et Dwarf2 basée sur la table de déroulage (dw2) exception des modèles de gestion. Quelle est la différence entre les deux modèles et la façon de choisir le modèle approprié? Pourquoi est-Dwarf2 basée sur la table de déroulage (dw2) le modèle plus efficace? Je comprends que les deux modèles ne peuvent pas être mélangés.
Référence: Aperçu de la technologie: gcc-4.2.1-sjlj -2
Vous devez vous connecter pour publier un commentaire.
Bien, dwarf2 construit des tables pour chaque fonction, qui contiennent ce que le destinataire de l'appel enregistré, les registres et où dans la pile qu'ils sont sauvés, et où le pointeur de cadre/adresse de retour dans la pile des appels est, et quelques autres trucs. Si vous utilisez dwarf2, le compilateur peut utiliser ces informations et de restaurer efficacement les registres, et revenir aux appelants dans le cas d'une exception. Les backends nécessité de fournir des informations dans leurs implémentations' prologue de la génération de code, de dire à GCC qui les registres callee-saved, et lorsque le pointeur de cadre a été sauvé et ce genre de chose.
À l'aide de setjmp/longjmp est juste un hack. Depuis setjmp/longjmp ne sais pas à propos de la structure de la fonction jeter, il permettra de restaurer tous les registres informatisés, conservés dans le saut-de la mémoire tampon par setjmp, même si elles n'ont pas été remplacées par le lancement de la fonction. Je ne suis pas vraiment un expert, mais je pense qu'il est évident que cela ne sera pas efficace. Aussi, chaque fois que vous démarrez un bloc try, setjmp doit être appelé pour fixer le tampon contenant les sauvés de registres, tandis que lors de l'utilisation de dwarf2, le compilateur fournit déjà de toutes les informations nécessaires au moment de la compilation.
Si les composants ne fournissent pas les informations nécessaires, GCC mettra automatiquement automne-retour à setjmp/longjmp base de la gestion des exceptions.
Remarque je ne suis pas un GCC expert. J'ai juste porté à la chaîne de traitement pour certains facile processeur de mon professeur, y compris GCC. J'espère que je pourrais vous aider un peu.
setjmp
de mise en œuvre qui est lui-même basé sur le nain tables. Doncsetjmp
suffit alors de stocker les stackpointer et de laisser le reste de la déjà au travail nain dérouleur.Éviter sjlj. Tous les "essayer" bloc d'appel setjmp qui
sauve les registres, les performances même si aucune des exceptions
sont soulevées. À l'aide de tableaux, le flux normal du contrôle
n'entraîne pas de coût d'exécution. Seulement quand une exception est levée
l'exception d'un mécanisme de gestion ont pour régulariser
par le biais des tables de comprendre quoi faire.