2010-09-19 8 views
12

J'ai déjà lu beaucoup de choses sur les exceptions C++ et ce que je vois, c'est que les exceptions en particulier les performances sont un sujet difficile. J'ai même essayé de regarder sous le capot de g ++ pour voir comment les exceptions sont représentées dans l'assemblage. Je suis un programmeur C, parce que je préfère les langages de bas niveau. Il y a quelque temps, j'ai décidé d'utiliser C++ sur C, car avec un petit coût, cela peut rendre ma vie beaucoup plus facile (classes sur des structures, des modèles, etc.).Performances lorsque les exceptions ne sont pas levées (C++)

En revenant à ma question, comme je vois des exceptions ne génèrent en tête bourgeon seulement quand ils se produisent , car il nécessite une longue séquence de sauts et des instructions de comparaisons pour trouver un gestionnaire d'exception appropriée. Dans l'exécution normale du programme (où il n'y a pas d'erreur), les préfixes d'exceptions sont égaux à la vérification normale du code de retour. Ai-je raison?

+0

* Merci * pour le suffixe "again" dans le titre. – delnan

+1

Je pense que la réponse est spécifique au compilateur –

+3

Si vous vous interrogez sur l'impact sur les performances, ** mesurez-le **. –

Répondre

12

Veuillez voir ma réponse détaillée à une question similaire here.

La gestion des exceptions est spécifique à la plate-forme et dépend du système d'exploitation, du compilateur et de l'architecture du processeur que vous utilisez.

Pour Visual Studio, Windows et x86, il y a un coût même lorsque les exceptions ne sont pas levées. Le compilateur génère du code supplémentaire pour garder trace de la "portée" actuelle qui est ensuite utilisée pour déterminer quels destructeurs appeler et où commencer à chercher des filtres d'exception et des gestionnaires. Les changements de portée sont déclenchés par des blocs try et la création d'objets avec des destructeurs.

Pour Visual Studio, Windows et x86-64, le coût est essentiellement nul lorsque des exceptions ne sont pas générées. L'ABI x86-64 a un protocole beaucoup plus strict sur la gestion des exceptions que x86, et le système d'exploitation soulève beaucoup de problèmes, de sorte que le programme lui-même n'a pas besoin de suivre autant d'informations pour gérer les exceptions.

Lorsque des exceptions se produisent, le coût est important, c'est pourquoi elles ne devraient se produire que dans des cas vraiment exceptionnels. La gestion des exceptions sur x86-64 est plus coûteuse que sur x86, car l'architecture est optimisée pour le cas le plus courant d'exceptions qui ne se produisent pas.

+0

Je sais que ça fait 3 ans, mais y a-t-il aussi très peu de surcharge sur Linux x86-64? – contrapsych

+1

@ JAKE6459 Je ne peux pas répondre définitivement, mais l'un des avantages de x86-64 sur x86 est la manière dont les exceptions sont supportées, et je suis sûr que Linux en profite. Comme toujours, si vous avez vraiment besoin de savoir, profilez votre code. Si vous utilisez C/C++ sous Linux, regardez dans 'gprof'. –

+0

Pouvez-vous honnêtement dire que le code compilé avec les exceptions désactivées n'est pas sensiblement plus rapide? –

4

est ici un examen détaillé du coût de la gestion des exceptions lorsque aucune exception sont en fait jetés:

http://www.nwcpp.org/old/Meetings/2006/10.html

En général, dans toutes les fonctions qui utilise la gestion des exceptions (a soit try/catch blocs ou automatique objets avec destructeur) - le compilateur génère un code prologue/epilog supplémentaire pour traiter l'enregistrement d'enregistrement d'expcetion.

Plus après la construction et la destruction de chaque objet automatique - quelques commandes d'assembleur supplémentaires sont ajoutées (ajustez l'enregistrement d'enregistrement des exceptions).

En outre, certaines optimisations peuvent être désactivées. C'est particulièrement le cas lorsque vous travaillez dans le modèle de gestion des exceptions dit "asynchrone".

+2

Pour info, le lien fourni est actuellement suspendu. : -/ –

Questions connexes