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 :

Rvalue et move (encore et toujours)


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut Rvalue et move (encore et toujours)
    Ecnore une question autour des concept des Rvalue references et du move semantics :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    struct Foo
    {
    	int n;
    	explicit Foo(int m):n(m)
    	{
    		std::cout << "constructeur\n";
    	} 
    	Foo(const Foo& n)
    	{ 
    		std::cout << "constructeur copie\n";
    	}
    	Foo(Foo&& n)
    	{ 
    		std::cout << "constructeur move\n";
    	}
    };
     
    Foo make()
    {
    	return Foo(3);
    }
     
    int main()
    { 	  	 
    	Foo po( make() );  //ok mais affiche uniquement constructeur ?!
    	std::cout << " " << po.n;
    	system("pause");
     
    }
     
    int main()
    { 	  	 
    	Foo po( move(make()) );  //passe bien dans le move ctor
    	std::cout << " " << po.n; // affiche n'importe quoi?!
    	system("pause");
     
    }
    Deux questions :

    pourquoi dans le premier main , on ne passe ni dans le ctor de copie ni dans le ctor de move ?

    pourquoi dans le 2eme cas, ça affiche n'importe quoi ?

    Merci.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    1/ NRVO + Copy-Elision : Le compilateur choisit de ne pas faire les copies intuiles, c'est à dire celles à la sortie de la fonction, et celle avec le copy_ctor, il créé directement l'objet sur place.

    2/ Le NRVO agit une première fois à la sortie de la fonction (sinon tu aurais ctor copy_ctor, et pas seulement ctor), puis tu utilises std::move donc il n'y a plus de copy-elision possible, et le move_ctor est utilisé.

    Pour la valeur c'est normal, ca a beau être une move_ctor, ca reste un contructeur, si tu ne donnes pas de valeur à ton attribut il est non-initialisé, et donc ca valeur c'est n'importe quoi.

    Pour ce qui concerne la sémantique de mouvement et les rref, il y a une séries d'articles sur le sujet sur cppnext, avec un rappel sur le (N)RVO et la copy-ellision au début. (Et il y a plusieurs exemples qui permettent de bien comprendre)

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    très clair merci.
    j'étais passé à côté de la copy-Elision

    du coup ça me laisse perplexe quand à l'utilité réel de la move semantics, ok pour le move quand on veut forcer une lvalue en rvalue mais à part ça ...??

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    très clair merci.
    j'étais passé à côté de la copy-Elision

    du coup ça me laisse perplexe quand à l'utilité réel de la move semantics, ok pour le move quand on veut forcer une lvalue en rvalue mais à part ça ...??
    La move semantic reste utile pour la construction par vol de ressource. Un temporaire est passé a un op= ou un ctor, tu echange les ressources et hop.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    on est bien d'accord que dans un code comme celui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<std::string> v;
    {
    std::string s = "sometext";
    v.push_back( std::move(s) );
    //s ne doit pas être accédé ??
    }
    //v[0] est toujours valide ??

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    on est bien d'accord que dans un code comme celui là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::vector<std::string> v;
    {
    std::string s = "sometext";
    v.push_back( std::move(s) );
    //s ne doit pas être accédé ??
    }
    //v[0] est toujours valide ??
    J'ai pas suivi ça de trop trop près (Loic?), mais ce qu'on garanti pour les types standards après qu'ils aient ete deplaces, ce qu'on exige des types arguments template de la SL et ce qui est fournit d'office et dans quelles circonstances pour les types declares par l'utilisateur était un des gros sujets de discussion lors du dernier meeting du comité.

    Autrement dit, même s'il n'est pas impossible que tu puisses faire quelque chose avec s, ne fait rien pour le moment, c'est pas impossible que ca ait change, c'est pas impossible que ca change.

Discussions similaires

  1. Clic droit encore et toujours
    Par Stéphane Olivier BERNARD dans le forum Access
    Réponses: 3
    Dernier message: 22/05/2006, 00h26
  2. IE/Firefox... encore et toujours...
    Par maniaco_jazz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 19/02/2006, 23h17
  3. nodes, child et compatibilité... encore et toujours
    Par pmithrandir dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/04/2005, 14h26
  4. stencil buffer, encore et toujours
    Par JAimeBienCoderBourre dans le forum OpenGL
    Réponses: 4
    Dernier message: 08/04/2005, 11h16

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