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 :

les rvalue reference


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut les rvalue reference
    Bonjour,
    je cherche quelques explications sur les rvalue qui seront utilisées dans la prochaine version du C++.

    En gros, ce que j'ai compris est que l'on pourra utiliser une instance non nommée pour faire des opérations.
    Par exemple on pourra passer en référence une instance d'un class créée sans nom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void f(A&& a)
    {
    ...
    }
     
    f(A());
    Si j'ai bien compris, on pourra même faire des bug comme
    ...
    est-ce bien cela ou je n'ai pas compris ce que c'est??
    merci

  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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    "rvalue reference", tu veux dire ?

    C'est un peu ça, mais ça va plus loin...

    L'article http://www.artima.com/cppsource/rvalue.html est assez bien foutu sur le sujet.
    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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Généralement, une rvalue(Right VALUE) représente... toute expression pouvant se trouver à droite d'un opérateur d'affectation (ou de comparaison)

    L'autre terme "concomitant" est la lvalue (Left VALUE) qui représente... toute expression pouvant se trouver à gauche d'un opérateur d'affectation (ou de comparaison)

    Ainsi, quand tu fais
    i est une lvalue (se trouve à gauche de l'opérateur d'affectation) et 2 est une rvalue (se trouve à droite de l'opérateur d'affectation)

    Si on parle d'expression ici, c'est parce que dans le cas d'un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = obj1.getA()+obj1.getB()*obj1.getC();
    tu te rend compte que pour évaluer la valeur à donner à i, il faut commencer:
    1. obtenir la valeur renvoyée par getA
    2. obtenir la valeur renvoyée par getB
    3. obtenir la valeur renoyée par getC
    4. multiplier la valeur obtenue en (2) par la valeur obtenue en (3)
    5. additionner la valeur obtenue en (1) par le résultat de (4)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    EN faite ma question viens de cette discutions :
    http://www.developpez.net/forums/sho...83#post3254883
    et c'est donc rvalue reference (je ne savait pas que rvalue était autre chose )

    J'ai regardé un peu le lien et je me pose déjà des questions sur l'implementation du swap avec les rvalue reference

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class T> swap(T& a, T& b)
    {
        T tmp(std::move(a));
        a = std::move(b);   
        b = std::move(tmp);
    }
    Ce que je comprend est que T doit avoir un constructeur et un operateur = prenant une rvalue reference. Cela reviendrai à pouvoir partager une implémentation privé de la class, n'est ce pas?
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T> f(T& a)
    {
        T tmp(std::move(a));
        a = 1;
    }
    quand a sera affecté par 1, tmp le sera aussi c'est bien ça???

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    de même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T> f(T& a)
    {
        T tmp;
        //traitement sur tmp
        ...
        a = std::move(tmp);
    }
    1- la memoire appartenant à a sera detruite si personne de l'utilise
    2- a prendra la memoire de tmp,
    3- tmp est détruit, aucune memoire n'est détruite.
    C'est bien ca?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Tout l'intérêt des rvalue references c'est de distinguer les rvalues des lvalues constantes, ce que le langage actuel ne permettait pas.

    En particulier, on peut se permettre de modifier des rvalues pour transférer leur valeur, ce qu'on peut pas vraiment se permettre avec les lvalues (constantes ou non).
    Boost ftw

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Y as un truc que je ne pige pas .
    Lors que l'on fera

    a et b devront swapper leur mémoire???
    Ou alors c'est juste l'exemple?

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Non, ça va caster b en rvalue, le but étant de déplacer b dans a.
    Y'a pas de swappage puisqu'on déplace pas a dans b.
    Boost ftw

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Non, ça va caster b en rvalue, le but étant de déplacer b dans a.
    Y'a pas de swappage puisqu'on déplace pas a dans b.
    que va devenir b dans ce cas??

  10. #10
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Si j'ai bien compris, il ne sera pas touché, il sera juste dupliqué dan a.

    (c'est bien ça?)

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Si j'ai bien compris, il ne sera pas touché, il sera juste dupliqué dan a.

    (c'est bien ça?)
    dupliqué == copié donc je dirait que non

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Salut,

    Voici un code qui j'espère va t'aider à mieux comprendre les rvalue reference:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <iostream>
    #include <cstring>
     
    class A
    {
    private:
      char *str;
      size_t length;
     
    public:
      A() : str(0), length(0)
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
      }
      A(char const *s)
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        str=new char[std::strlen(s)+1];
        length=std::strlen(s)+1;
        strcpy(str, s);
      }
      A(A const &a)
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        str=new char[a.length];
        length=a.length;
        std::memcpy(str, a.str, length);
      }
      A(A &&a)
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        length=a.length;
        a.length=0;
        str=a.str;
        a.str=0;
      }
      ~A()
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        delete[] str;
      }
      A& operator=(A const &a)
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        char *tmp=0;
        tmp=new char[a.length];
        std::memcpy(tmp, a.str, a.length);
        delete[] str;
        length=a.length;
        str=tmp;
        return *this;
      }
      A& operator=(A &&a)
      {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        delete[] str;
        length=a.length;
        a.length=0;
        str=a.str;
        a.str=0;
        return *this;
      }
    };
     
    int main(void)
    {
      A a;
      A b;
     
      b="toto"; //appel de A::operator=(A &&)
      a=std::move(b); //appel de A::operator=(A &&)
      A c(std::move(a)); //appel de A::A(A &&);
     
      return 0;
    }
    Ce code compile avec gcc 4.3.0 avec l'option -std=c++0x

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    que va devenir b dans ce cas??
    Il deviendra "vide".
    Bien entendu tout cela dépend de comment tu implémentes ton constructeur et ton opérateur d'affectation de déplacement...
    Boost ftw

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    okok.
    Donc lorque l'on fait a=std::move(b), a récupère les info de b et b est réinitialisé à zéro.

    Du coup
    dans l'exemple http://www.artima.com/cppsource/rvalue.html peut tu m'expliquer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     // move semantics
        clone_ptr(clone_ptr&& p)
            : ptr(p.ptr) {p.ptr = 0;}
    
        clone_ptr& operator=(clone_ptr&& p)
        {
            std::swap(ptr, p.ptr);
            return *this;
        }
    merci.

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ça ressemble à une erreur. Il vaut mieux libérer l'ancienne valeur de suite que de la transférer à la rvalue (qui peut ne pas vraiment en être une).
    Il y a d'ailleurs une autre erreur dans le code, si clone lève une exception ça peut laisser le clone_ptr dans un état indéterminé, ce qui est pas terrible.

    C'est assez surprenant néanmoins vu les auteurs...
    J'ai posté un message à ce sujet sur le forum associé à ce site.
    Boost ftw

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Ça ressemble à une erreur. Il vaut mieux libérer l'ancienne valeur de suite que de la transférer à la rvalue (qui peut ne pas vraiment en être une).
    Il y a d'ailleurs une autre erreur dans le code, si clone lève une exception ça peut laisser le clone_ptr dans un état indéterminé, ce qui est pas terrible.

    C'est assez surprenant néanmoins vu les auteurs...
    merci beaucoup

Discussions similaires

  1. [c++0x] Lumière sur les rvalue references
    Par Arzar dans le forum Langage
    Réponses: 39
    Dernier message: 08/10/2009, 14h56
  2. [Excel] Supprimer les cellules references
    Par VlaMonPseudo dans le forum Excel
    Réponses: 2
    Dernier message: 28/06/2007, 13h43

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