41 votes

Les exceptions sont-elles toujours indésirables dans l'environnement en temps réel?

Il y A quelques années on m'a appris, que dans des applications en temps réel telles que les Systèmes Embarqués ou à la (Non-Linux-)Kernel-développement C++-les Exceptions sont indésirables. (Peut-être que la leçon a été avant gcc-2.95). Mais je sais aussi, que la gestion des exceptions est devenu mieux.

Alors, êtes - C++-les Exceptions dans le contexte des applications en temps réel dans la pratique

  • totalement non désirés?
  • même être désactivé via le compilateur de l'interrupteur?
  • ou très soigneusement utilisable?
  • ou bien traitée maintenant, que l'on peut utiliser presque librement, avec un couple de choses à l'esprit?
  • Est-ce que C++11 changer quoi que ce soit w.r.t. cette?

Mise à jour: Ne exception de la manipulation vraiment besoin de RTTI pour être activé (comme un répondeur suggéré)? Y sont dynamiques jette impliqués, ou similaires?

22voto

Matthieu M. Points 101624

Les Exceptions sont maintenant bien gérée, et les stratégies utilisées pour mettre en œuvre les rendent en effet plus rapide que les tests de code de retour, en raison de leur coût (en termes de vitesse) est pratiquement nulle, tant que vous ne le jetez pas.

Cependant, ils ne les prix: dans le code de la taille. Exceptions pour habitude de travailler main dans la main avec RTTI, et, malheureusement, RTTI est différent de tous les autres C++ fonctionnalité, vous devez l'activer ou de la désactiver pour l'ensemble du projet, et une fois activé, il sera généré code complémentaire pour toute la classe qui arrive à avoir une méthode virtuelle, défiant ainsi le "vous n'avez pas à payer pour ce que vous n'utilisez pas d'état d'esprit".

Aussi, elle ne nécessite code complémentaire pour sa manipulation.

Par conséquent, le coût des exceptions ne se mesure pas en termes de vitesse, mais en termes de code de la croissance.

EDIT:

D' @Space_C0wb0y: Ce blog l'article donne un petit aperçu, et introduit deux généralisée des méthodes pour la mise en œuvre des exceptions Sauts et à Coût Zéro. Comme son nom l'indique, de bons compilateurs utilisent maintenant le Coût Zéro mécanisme.

L'article de Wikipedia sur la Manipulation d'Exception parler des deux mécanismes utilisés. Le Coût Zéro mécanisme est la Table Piloté par un.

EDIT:

D' @Vlad Lazarenko dont le blog, j'avais référencé ci-dessus, la présence de l'exception levée d'empêcher un compilateur à partir de l'in-lining et de l'optimisation de code dans les registres.

11voto

Steve Jessop Points 166970

Réponse juste à la mise à jour:

N'exception de la manipulation vraiment besoin RTTI pour être activé

Gestion des exceptions en a réellement besoin de quelque chose de plus puissant que RTTI et de la dynamique de fonte dans un sens. Considérons le code suivant:

try {
    some_function_in_another_TU();
} catch (const int &i) {
} catch (const std::logic_error &e) {}

Ainsi, lorsque la fonction dans l'autre TU le jette, il va avoir l'air de la pile (cochez tous les niveaux immédiatement, ou de vérifier un niveau à un moment pendant le déroulement de pile, jusqu'à la mise en œuvre) pour une clause catch qui correspond à l'objet en cours de levée.

Pour effectuer ce match, il pourrait ne pas l'aspect de RTTI qui stocke le type de chaque objet, puisque le type de la levée d'une exception est la statique type de le jeter expression. Mais il ne faut comparer les types dans un instanceof , et il doit le faire au moment de l'exécution, parce qu' some_function_in_another_TU pourrait être appelée à partir de n'importe où, avec n'importe quel type de catch sur la pile. Contrairement aux dynamic_cast, il doit procéder à cette exécution instanceof vérifier sur des types qui n'ont pas de virtuel fonctions de membre, ainsi que les types qui ne sont pas des types de classe. Cette dernière partie n'est pas ajouter de la difficulté, parce que les types de classe ont pas de hiérarchie, et donc tout ce qui est nécessaire est de l'égalité de traitement, mais vous avez encore besoin de saisir les identifiants qui peut être comparé à l'exécution.

Donc, si vous activez les exceptions alors vous avez besoin de la partie de RTTI qui n'type de comparaisons, comme dynamic_cast's type de comparaisons, mais couvrant plus de types. Vous n'avez pas nécessairement besoin de la partie de RTTI qui stocke les données utilisées pour effectuer cette comparaison dans chaque classe de la vtable, où il est accessible à partir de l'objet-données pourrait seulement être encodée au point de jeter l'expression et chaque clause catch. Mais je doute que c'est une économie importante, puisqu' typeid objets ne sont pas exactement énorme, ils contiennent un nom qui est souvent nécessaire de toute façon dans la table des symboles, en plus de certains de la mise en œuvre de données défini pour décrire le type de hiérarchie. Alors, probablement, vous pourriez aussi bien avoir tous RTTI par ce point.

8voto

littleadv Points 15607

Le problème avec les exceptions n'est pas nécessairement la vitesse (qui peuvent varier considérablement, en fonction de la mise en œuvre), mais c'est ce qu'ils font réellement.

Dans le vrai monde en temps, quand vous avez une contrainte de temps sur une opération, vous devez savoir exactement ce que votre code ne. Exceptions fournissent des raccourcis qui peuvent influer sur l'ensemble de la durée d'exécution de votre code (gestionnaire d'exception ne peut pas entrer dans le réel de la contrainte de temps, ou en raison d'une exception vous risquez de ne pas renvoyer la réponse à la requête, par exemple).

Si tu veux dire "en temps réel", comme en fait "embedded", puis le code de la taille, comme mentionné, devient un problème. Code incorporé peut ne pas être nécessairement en temps réel, mais il peut avoir de contrainte de taille (et très souvent).

Aussi, les systèmes embarqués sont souvent conçus pour fonctionner à jamais, dans une infinité de cas de la boucle. Exception peut vous emmener quelque part hors de la boucle, et aussi corrompre votre mémoire et de données (en raison du déroulement de pile) - encore une fois, dépend de ce que vous faites avec eux, et comment le compilateur fait qu'il implémente.

Donc mieux vaut prévenir que guérir: ne pas utiliser les exceptions. Si vous pouvez maintenir occasionnel de défaillances du système, si vous êtes en cours d'exécution dans une tâche séparée que l'on peut facilement redémarré, si vous n'êtes pas vraiment en temps réel, juste faire semblant de l'être, alors vous pouvez probablement essayer. Si vous êtes d'un logiciel d'écriture pour un coeur-pacer, je préfère vérifier les codes de retour.

5voto

Crashworks Points 22920

Les exceptions C++ ne sont toujours pas pris en charge par tous en temps réel de l'environnement d'une manière qui les rend acceptables partout.

Dans l'exemple particulier de jeux vidéo (qui ont un doux 16.6 ms date limite pour chaque image), le leader des compilateurs de mettre en œuvre les exceptions C++ d'une manière telle que, simplement en tournant sur la gestion des exceptions dans votre programme va considérablement ralentir et augmenter la taille du code, peu importe si vous avez réellement lancer des exceptions ou pas. Étant donné qu'à la fois les performances et la mémoire sont critiques sur une console de jeu, c'est un dealbreaker: la PS3 SPU unités, par exemple, 256 ko de mémoire pour le code et les données!

En plus de cela, de lever des exceptions est encore assez lent (mesure si vous ne me croyez pas) et peut provoquer des tas de deallocations qui sont aussi peu souhaitable dans le cas où vous n'avez pas de microsecondes de rechange.

La une... euh... d'exception que j'ai vu à cette règle est le cas où l'exception peut-être lancé une fois par app run-pas une fois par image, mais littéralement une fois. Dans ce cas, la gestion structurée des exceptions est une manière acceptable pour attraper des données sur la stabilité de l'OS quand un jeu se bloque et le relayer pour le développeur.

3voto

BЈовић Points 28674

La mise en œuvre du mécanisme d'exception est généralement très lente lorsqu'une exception est levée, sinon les coûts de l'utilisation, est presque rien. À mon avis, les exceptions sont très utiles si vous les utilisez correctement.

En RT applications, des exceptions doivent être levées que lorsque quelque chose va mal et le programme a permis d'arrêter et de résoudre le problème (et possible d'attendre l'intervention de l'utilisateur). Dans de telles circonstances, il faut plus de temps pour résoudre le problème.

Les Exceptions offrent chemin caché de rapport d'erreur. Elles rendent le code plus court et plus lisible, donc plus facile d'entretien.

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