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++

  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 : 51
    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