Jerry a déclaré: ... le résultat n'est plus tout à fait C ++ , alors que, selon ma métaphore, il s'agit clairement de C ++, un dialecte légèrement différent , car les programmes utilisent d'autres formes, conventions et styles écrits.
Voici mes principales raisons pour les désactiver:
Compatibilité binaire
Le fait de croiser les frontières de la langue et de la traduction n’est pas universellement bien défini ni indéfini. Si vous voulez garantir que votre programme fonctionne dans le domaine de comportement défini, vous devrez mettre les exceptions en quarantaine aux points de sortie du module.
Taille exécutable
Voici les tailles binaires d'un programme sans exception que j'ai écrit, construit sans et avec les exceptions activées:
Sans exception:
- exécutable + dépendances: 330
- exécutable dépouillé final (release build): 37
Avec des exceptions:
- exécutable + dépendances: 380
- exécutable dépouillé final (release build): 44
Rappel: Il s’agit d’un ensemble de bibliothèques et de programmes ne contenant aucun jet / attrape. Le drapeau du compilateur fait activer des exceptions dans la bibliothèque standard C de. Par conséquent, le coût dans le monde réel est supérieur à 19% dans cet exemple.
Compilateur: apple gcc4.2 + llvm. Tailles en MB.
La vitesse
Malgré l'expression "exceptions à coût zéro", ils ajoutent encore des frais généraux même lorsque rien ne se produit jamais. Dans le cas ci-dessus, il s'agit d'un programme critique en termes de performances (traitement du signal, génération, présentation, conversions, avec de grands ensembles de données / signaux, etc.). Les exceptions ne sont pas une caractéristique nécessaire dans cette conception, alors que les performances sont très importantes.
Exactitude du programme
Cela semble être une raison étrange ... Si lancer n’est pas une option, vous devez écrire des programmes relativement stricts, corrects et bien testés pour vous assurer que votre programme s’exécute correctement et que les clients utilisent correctement les interfaces (si vous me donnez un mauvais argument vérifiez pas un code d'erreur, alors vous méritez UB). Le résultat? La qualité de la mise en œuvre s'améliore considérablement et les problèmes sont résolus rapidement.
Simplicité
Les implémentations de gestion des exceptions ne sont pas souvent mises à jour. Ils ajoutent également beaucoup de complexité car une implémentation peut avoir beaucoup de nombreuses séquences de sortie. Il est plus simple de lire et de gérer des programmes très complexes lorsqu'ils utilisent un petit ensemble de stratégies de sortie bien définies, typées et qui sortent du lot et sont gérées par le client. Dans d'autres cas, les implémentations peuvent au fil du temps implémenter plus de lancers ou leurs dépendances peuvent les introduire. Les clients ne peuvent pas se défendre facilement ou adéquatement contre toutes ces issues. J'écris et mets à jour beaucoup de bibliothèques, il y a des évolutions et améliorations fréquentes. Essayer de garder tout cela synchronisé avec les séquences de sortie d'exception (dans une base de code volumineuse) ne serait pas une bonne utilisation du temps, et ajouterait probablement beaucoup de bruit et de crudité. En raison de l'exactitude du programme et de la multiplication des tests,
Histoire / Code existant
Dans certains cas, ils n'ont jamais été introduits pour des raisons historiques. Une base de code existante ne les utilisait pas, la modification des programmes pouvait prendre des années-hommes et rendre vraiment moche à maintenir en raison du chevauchement des conventions et des mises en œuvre.
Inconvénients
Bien sûr, il y a des inconvénients, les plus importants sont: l'incompatibilité (y compris binaire) avec d'autres bibliothèques et le fait que vous devrez implémenter une bonne quantité de programmes pour s'adapter à ce modèle.