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 :

[C++0x] std::move(), rvalue reference et comparses


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut [C++0x] std::move(), rvalue reference et comparses
    Bonjour,

    On a beau �tre pointu sur certains sujets, il est est d'autres qui r�sistent � notre mani�re d'appr�hender les choses. Sur une grosse partie du futur standard, je n'ai aucun probl�me de compr�hension. Mais sur les rvalue references, je cale tr�s nettement.

    Ceci �tant dit, j'en viens � mon probl�me. A toutes fins utiles, voici une information d'importance :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    edt@desktop:~/ddcomp$ g++ -v
    Using built-in specs.
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
    Bien. J'essaie d'impl�menter une surcouche � libxml2 qui corresponde � mes besoins. J'en viens au code de la classe xml::document :

    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
     
    namespace xml {
     
        document&& read_xml_file(const std::string& path)
        {
    	xmlDocPtr xmldoc = xmlReadFile(path.c_str(), NULL, 0);
    	if (xmldoc)
    	{
    	    return std::move(document(xmldoc));
    	}
    	std::stringstream stream;
    	stream << "cannot parse '" << path << "' as an XML file";
    	throw std::invalid_argument(stream.str());
        }
     
        document::document(xmlDocPtr xmldoc)
        : m_doc(xmldoc)
        {
        }
     
        document::document(document&& other)
        : m_doc(other.m_doc)
        {
    	other.m_doc = nullptr;
        }
     
        document::~document()
        {
    	if (m_doc)
    	{
    	    xmlFreeDoc(m_doc);
    	}
        }
     
    }
    (nullptr, n'�tant aps encore reconnu par g++ 4.4, est en fait un simple #define nullptr 0; �a n'a pas d'importance dans notre cas, mais �a peut en avoir si vous avez envie de compiler le code).

    Ce code est ainsi utilis� :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    {
      xml::document d = xml::read_xml_file(path_to_file);
    }
    Dans mon esprit, les choses suivantes devraient se passer :

    1) cr�ation d'une instance de xml::document()
    2) transformation de cette instance en rvalue reference (gr�ce � std::move)
    3) appel du move constructor, et donc �change des valeurs de pointeur xmlDocPtr (NULL contre un pointeur valide)
    4) destruction de la rvalue reference, qui contient un nullptr (donc le destructeur ne fait pas grand chose)
    5) destruction de l'instance "d"

    C'est probablement l� (dans mon esprit, je veux dire) que le b�t blesse. Parce que les choses ne se passent pas du tout comme �a. A la place, le constructeur prenant une rvalue ref n'est jamais appel�, donc l'�change ne se passe jamais, et les deux instances existantes (la temporaire et celle qui est r�ellement utilis�e) poss�dent le m�me pointeur. Bien evidemement, un probl�me se pose lors de la destruction : xmlFreeDoc() plante, lamentablement, parce que le pointeur est lib�r� deux fois.

    Ce n'est pas ce qui �tait pr�vu dans mon esprit tortur�.

    Est-ce que l'un de vous pourrait me pointer mon erreur - de raisonnement, de code, etc - et (bonus accord� sous la forme de mon �ternelle gratitude) m'expliquer ce que visiblement, je n'ai pas compris (et comme je ne l'ai pas compris, je ne sais m�me pas ce que c'est) ?

    Merci d'avance !
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    �a ne pose pas de probl�me, qu'une fonction retourne une rvalue reference sur un temporaire? Je ne connais pas assez les rvalue reference, mais �a me para�t suspect...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre �clair�
    Avatar de gb_68
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2006
    Messages
    232
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 232
    Par d�faut
    Citation Envoy� par M�dinoc Voir le message
    �a ne pose pas de probl�me, qu'une fonction retourne une rvalue reference sur un temporaire? Je ne connais pas assez les rvalue reference, mais �a me para�t suspect...
    Oui, c'est comme pour les lvalue reference.

    Je pense que l'ordre des �v�nements est plus proche de :
    1) cr�ation d'une instance de xml::document()
    2) transformation de cette instance en rvalue reference (gr�ce � std::move)
    3) destruction du temporaire (dont on renvoie la rvalue reference )
    4) appel du move constructor
    5) destruction de l'instance "d"

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Non une rvalue peut �tre bind� � une rvalue r�f�rence.

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Et �a �tend sa dur�e de vie comme certaines r�f�rences const?

    Parce que pour l'instant, pour moi �a ressemble vachement � un retour de variable locale par r�f�rence...

    Edit: D'ailleurs, le retour de fonction ne semble pas faire partie des cas o� la r�f�rence const �tend la dur�e de vie:
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    int const & Test(void)
    {
    	int var = 42;
    	return var;
    }
    Ce code me donne un "warning C4172: returning address of local variable or temporary" sous VS2008.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Citation Envoy� par Emmanuel Deloget Voir le message
    Mais n'�tais-ce pas justement l'un des points qui rendait les rvalue reference si attractives ? Le fait de pouvoir y binder de temporaries (et donc de joueur avec leur dur�e de vie) ?
    Si c'est m�me leur raison d'�tre ... On sait qu'une rvalue sera bind� � une rvalue ref :

    void foo(T&& t);
    foo(T()); <== marche, ressource stealing tout �a.



    @Goten : c'est pas dr�le. D�j�, j'ai du virer les lambda de mon code parce qu'elles ne sont support�es qu'a� partir de g++ 4.5. L�, tu est en train de me dire qu'il me faut g++ 4.6 pour que les rvalue ref soient g�r�es correctement ?

    Je vais pleurer...
    Sur 4.5 les rvalue ref sont bien g�r�es si je me souviens bien...

  7. #7
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par gb_68 Voir le message
    Oui, c'est comme pour les lvalue reference.

    Je pense que l'ordre des �v�nements est plus proche de :
    1) cr�ation d'une instance de xml::document()
    2) transformation de cette instance en rvalue reference (gr�ce � std::move)
    3) destruction du temporaire (dont on renvoie la rvalue reference )
    4) appel du move constructor
    5) destruction de l'instance "d"
    Mais n'�tais-ce pas justement l'un des points qui rendait les rvalue reference si attractives ? Le fait de pouvoir y binder de temporaries (et donc de joueur avec leur dur�e de vie) ?

    @Goten : c'est pas dr�le. D�j�, j'ai du virer les lambda de mon code parce qu'elles ne sont support�es qu'a� partir de g++ 4.5. L�, tu est en train de me dire qu'il me faut g++ 4.6 pour que les rvalue ref soient g�r�es correctement ?

    Je vais pleurer...
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    @Emmanuel, tu as du confondre avec ceci:
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    int Toto();
     
    void Tata()
    {
    	int && titi = Toto();
    }
    Dans ce sens, il me semble que l'extension de dur�e de vie marche.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre �clair�
    Avatar de gb_68
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Ao�t 2006
    Messages
    232
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 232
    Par d�faut
    Citation Envoy� par Emmanuel Deloget Voir le message
    Mais n'�tais-ce pas justement l'un des points qui rendait les rvalue reference si attractives ? Le fait de pouvoir y binder de temporaries (et donc de joueur avec leur dur�e de vie) ?
    L'int�r�t est surtout d'attraper des temporaires
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    document read_xml_file(const std::string& path) // pas de rvalue ref ici
        {
    	xmlDocPtr xmldoc = xmlReadFile(path.c_str(), NULL, 0);
    	if (xmldoc)
    	{
    	    return std::move(document(xmldoc)); // move voire laisser (N)RVO
    	}
    	std::stringstream stream;
    	stream << "cannot parse '" << path << "' as an XML file";
    	throw std::invalid_argument(stream.str());
        }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    {
      xml::document d = xml::read_xml_file(path_to_file); // temporaire -> move constructor 
    }
    D'apr�s les articles que j'ai lus (j'ai peut-�tre pas lu les bons ), renvoyer un rvalue reference c'est souvent une erreur. http://pizer.wordpress.com/2009/04/1...ue-references/

  10. #10
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Bien. Ne pouvant utiliser autre chose que g++ 4.4, je suis de toute fa�on bloqu�. Donc exit cette bien agr�able construction, et retour � la case "renvoi d'une nouvelle instance dynamique". J'aurais aim� ne pas avoir de pointeur dans le code, ce qui eut �t� une bonne chose, mais tans pis.

    Du coup, vu les difficult�s que j'ai avec le support de C++0x avec g++ 4.4, je crois que je vais me limiter � du C++98 classique, avec peut-�tre un poil de TR1 si j'en ai l'utilit�.

    En tout cas, merci � tous. Ma journ�e n'a pas �t� perdue, gr�ce � vous !
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Citation Envoy� par gb_68 Voir le message
    L'int�r�t est surtout d'attraper des temporaires
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    document read_xml_file(const std::string& path) // pas de rvalue ref ici
        {
    	xmlDocPtr xmldoc = xmlReadFile(path.c_str(), NULL, 0);
    	if (xmldoc)
    	{
    	    return std::move(document(xmldoc)); // move voire laisser (N)RVO
    	}
    	std::stringstream stream;
    	stream << "cannot parse '" << path << "' as an XML file";
    	throw std::invalid_argument(stream.str());
        }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    {
      xml::document d = xml::read_xml_file(path_to_file); // temporaire -> move constructor 
    }
    D'apr�s les articles que j'ai lus (j'ai peut-�tre pas lu les bons ), renvoyer un rvalue reference c'est souvent une erreur. http://pizer.wordpress.com/2009/04/1...ue-references/
    Oui tout � fait, dans ma r�ponse j'ai oublier de checker son type de retour. Enfin, reste que ce code ne marchera de toute fa�on pas avec gcc 4.3/4.4 (dans ce cas pr�cis je pr�f�re le NRVO)

  12. #12
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Ton gcc est trop vieux, y'a eu *beaucoup* de changements sur les r�gles des rvalue depuis et le tiens n'est pas � jour.... Pour preuve :



    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    naabed@screwed:~/dev$ gcc -v
    Using built-in specs.
    Target: i486-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
    Thread model: posix
    gcc version 4.4.5 (Debian 4.4.5-8)
    naabed@screwed:~/dev$ g++ main.cpp --std=c++0x
    naabed@screwed:~/dev$ ./a.out
    naabed@screwed:~/dev$
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    naabed@screwed:~/dev/gcc-objdir/bin/bin$ ./g++ -v
    Using built-in specs.
    COLLECT_GCC=./g++
    COLLECT_LTO_WRAPPER=/home/naabed/dev/gcc-objdir/bin/libexec/gcc/i686-pc-linux-gnu/4.6.0/lto-wrapper
    Target: i686-pc-linux-gnu
    Configured with: ../gcc-trunk/configure --prefix=/home/naabed/dev/gcc-objdir/bin/ --enable-languages=c,c++ : (reconfigured) ../gcc-trunk/configure --prefix=/home/naabed/dev/gcc-objdir/bin/ --enable-languages=c,c++
    Thread model: posix
    gcc version 4.6.0 20101110 (experimental) (GCC) 
    naabed@screwed:~/dev/gcc-objdir/bin/bin$ ./g++ ~/dev/main.cpp --std=c++0x
    naabed@screwed:~/dev/gcc-objdir/bin/bin$ ./a.out 
    move ctor
    naabed@screwed:~/dev/gcc-objdir/bin/bin$

    avec :
    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
     
    class A
    {
        public :
        A(A&& other) : p_(other.p_)
        {
    	std::cout << "move ctor";
    	other.p_ = 0;
        }
     
        A() : p_(0) {}
     
        private :
        int* p_;
    };
     
    A&& get()
    {
        A a;
        return std::move(a);
    }
     
    int main()
    {
        A a = get();
    }

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Design, performances, rvalues et std::move
    Par victor_gasgas dans le forum Langage
    R�ponses: 2
    Dernier message: 10/12/2011, 18h49
  2. R�ponses: 4
    Dernier message: 03/04/2011, 20h14
  3. les rvalue reference
    Par yan dans le forum C++
    R�ponses: 15
    Dernier message: 15/05/2008, 16h45

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