IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

La double copie de *this est-elle une bonne pratique pour fournir du code exception-safe ?


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 8
    Points
    8
    Par défaut La double copie de *this est-elle une bonne pratique pour fournir du code exception-safe ?
    Bonjour,

    Je cherche à coder une classe fournissant la strong guarantee en matière d'exception safety pour toutes ses opérations.
    En postulant que l'opérateur d'affectation de la classe à laquelle appartient cette méthode fournit déjà la strong guarantee, je me suis dit qu'il suffisait de faire ça dans chaque méthode pour que la classe entière fournisse cette garantie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MaCLasse Moi = *this; // n'a aucun incidence sur this
    //...    
    // code qui modifie Moi et qui:
    // - ne modifie aucun objet externe (que ce soit par paramètre de la fonction ou par singleton)
    // - suit l'idiôme RAII pour qu'il n'y ait pas de fuite
    //...
    *this = Moi; // strong guarantee de l'opérateur '=', donc soit ça throw et c'est comme si rien ne s'était passé, soit ça passe
    Ca m'a l'air ok (ou pas ?), mais je voulais savoir si c'était une pratique courante, ou si au contraire ça ne se fait jamais.
    Votre avis ?

    Merci.

    PS: j'ai du mal à faire des recherches sur le sujet, car je tombe toujours sur des généralités ou sur l'écriture d'un opérateur d'affectation fournissant la strong guarantee (ce qui n'est pas le sujet).

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Si j'ai bien compris, tu veux que dans chaque fonction de ta classe soit elle réussie et l'objet change d'état, soit elle échoue et alors l'état est restauré tel qu'à l'appel. Pour cela tu travailles sur une copie temporaire et tu bascule ton état global à la fin. Pourquoi pas. Je vois 3 inconvénients : tu dois supporter la copie et éventuellement son coût. Et si ta fonction appelle une autre fonction, qui appelle, etc... tu multiplies les copies. Enfin, dans un cadre polymorphe (mais tu n'aurais probablement pas de sémantique de copie alors), tu perds le type effectif.
    Il y a aussi Boost.Scoop Exit qui peut t'aider à insérer des points de restauration.

  3. #3
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Etrangement, j'aurais essayait "fragmenté" l'affaire autant que possible. i.e. Plutôt de copier this, ce qui peut être super lourd, j'aurais copier/cloner les attributs sur lequel je ferai des opérations.

    Après, je crois que BS sort un truc comme quoi la strong guaranty ne devrait pas faire de back-up. Trop couteux.

    D'ailleurs :
    [2] Strong guarantee: If an exception is thrown, any container being manipulated remains in
    the state in which it was before the standard-library operation started.
    {...}
    Alternative [2] is unacceptable
    because it imposes the cost of roll-back semantics on every individual standard-library operation.
    {...}
    Strong guarantee for key operations: In addition to providing the basic guarantee, either
    the operation succeeds, or has no effects.
    B. Stroustrup, The C++ Programing Language, Appendix E2.

    [edit] Bon après c'est pour les conteneur, un cas extrême, mais la philosophie et là.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Oui c'est un idiome connu et utilisé, à ceci près qu'on utilisera swap() plutôt que l'opérateur de copie pour valider les changements à la fin de la fonction, c'est moins couteux.

    A noter que les fonctions swap() sont généralement très utiles en terme d'exception safety car elles sont souvent simples à implémenter, rapides et nothrow.

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    @Lavock j'ai bien un conteneur, mais en pratique le nombre d'éléments ne dépassera pas la dizaine.

    si ta fonction appelle une autre fonction, qui appelle, etc... tu multiplies les copies
    Very good point. Ce n'est pas mon cas pour mon code mais comme je voulais un avis généralisé, c'est vrai que c'est tellement évident que je n'y avais pas pensé. D'ailleurs, l'opérateur d'affectation fait lui aussi une copie (puis un swap), ça commence déjà à faire beaucoup

    Merci à vous trois, j'y vois plus clair
    Il ne s'agit pas de code critique, mais je voulais avoir quelques avis extérieurs.
    Je mettrai résolu s'il n'y a pas d'autres avis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 24
    Dernier message: 06/01/2010, 15h36
  2. Réponses: 6
    Dernier message: 26/08/2009, 21h31
  3. Réponses: 14
    Dernier message: 20/05/2009, 11h40
  4. hp est-elle une bonne marque
    Par babafredo dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 07/03/2008, 14h29
  5. Acer est-elle une bonne marque?
    Par SirTurbo dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 30/12/2007, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo