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

C++ Discussion :

constructeur de recopie:question theorique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut constructeur de recopie:question theorique
    Bonsoir, j'ai cette fonction ass qui me revoit un type chiffre ( qui est une classe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chiffre ass(chiffre u)
    { chiffre c(1,1) ;
      chiffre v(c) ;
      chiffre w = c ;
      return w ;
    }
    Vous etes d'accord que le constrcuteur par recopie est appelé 4 fois dans cette fonction ?

    Mais quand je fais ca , le constructeur par recopie est appelé 7 fois au lieu de 9



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main ()
    {
    		chiffre y(2,2) ;
    		chiffre z = ass ( ass(y) ); // <------ 7 fois appelés
     
    }
    Quelqu'un peut m'expliquer pourquoi ?

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Il existe ce qui s'appelle la RVO, ou return value optimisation. Le compilateur est autorisé à supprimer la copie résultant du retour d'une valeur d'une fonction.

    Un extrait de la norme :

    Whenever a temporary class object is copied using a copy constructor, and this object and the copy have the same cvunqualified type, an implementation is permitted to treat the original and the copy as two different ways of referring to the same object and not perform a copy at all, even if the class copy constructor or destructor have side effects. For a function with a class return type, if the expression in the return statement is the name of a local object, and the cvunqualified type of the local object is the same as the function return type, an implementation is permitted to omit creating the temporary object to hold the function return value, even if the class copy constructor or destructor has side effects. In these cases, the object is destroyed at the later of times when the original and the copy would have been destroyed without the optimization. 111) [Example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Thing {
    public:
      Thing();
      ~Thing();
      Thing(const Thing&);
      Thing operator=(const Thing&);
      void fun();
    };
    Thing f() {
      Thing t;
      return t;
    }
    Thing t2 = f();
    Here t does not need to be copied when returning from f. The return value of f may be constructed
    directly into the object t2. ]
    __________________
    111) Because only one object is destroyed instead of two, and one copy constructor is not executed, there is still one object destroyed
    for each one constructed.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    donc si j'ai bien compris c'est le compilateur qui decide lui meme si il supprime la recopie ou pas à la sortie de la fonction ?
    Donc le programmeur ne peut pas savoir combien de fois le constructeur par recopie est appelé ?
    Sinon connais tu des liens ou des livres qui parlent de cas en details ?

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Fais ce genre de tests en désactivant les optimisations lors de la compilation.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    sous visual c++ c'est deja desactivé par defaut

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          chiffre y(2,2) ; 
          chiffre z = ass ( ass(y) ); // <------ 7 fois appelés
    Premier ass( y ) : appelé 4 fois.
    On se retrouve dans le 2° ass, avec u déjà copié (return précédent).
    On fait 3 copies de plus. A la sortie ça a été recopié dans z, donc c'est fini. 4 +3 = 7, c'est bon.

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 182
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    chiffre y(2,2) ;
          chiffre z = ass ( ass(y) ); // <------ 7 fois appelés
    ass ( ass(y) ) ------> 4+3 = 7 fois
    chiffre z = ass ( ass(y) ) -----> 1 fois pour le z non ?

    donc 8 en tout logiquement.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Non justement, la même règle s'applique ici. z est construit directement à partir du retour de ass.

Discussions similaires

  1. constructeur de recopie et héritage
    Par r0d dans le forum C++
    Réponses: 11
    Dernier message: 08/02/2006, 09h47
  2. QObject et constructeur de recopie
    Par ionnn dans le forum Qt
    Réponses: 12
    Dernier message: 07/01/2006, 11h50
  3. Constructeur par recopie
    Par KernelControl dans le forum C++
    Réponses: 2
    Dernier message: 29/12/2005, 12h24
  4. Constructeur par recopie
    Par sdebrois dans le forum Composants VCL
    Réponses: 13
    Dernier message: 21/10/2004, 14h47
  5. question theorique
    Par discogarden dans le forum Développement
    Réponses: 4
    Dernier message: 29/01/2003, 17h05

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