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

Langage C++ Discussion :

Retour de fonction par référence?


Sujet :

Langage C++

  1. #21
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par mintho carmo Voir le message
    Il n'y a pas de problème d'alias avec @=.
    Prends le cas de la multiplication de nombres complexes (et donc de *=) et tu verras le problème qu'évoque Jean-Marc

  2. #22
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par mintho carmo Voir le message
    Il n'y a pas de problème d'alias avec @=.
    La forme canonique (depuis un article de Koening je crois) pour l'implémentation des opérateurs, c'est celle donnée par leternel avec la correction de bretus
    Tu me montres une multiplication de matrice implémentée comme ça et on regarde les allocations?

    Citation Envoyé par Bousk Voir le message
    Sauf si tu veux une opération dont l'ordre des opérandes importe (je sais plus le termr, la multiplication matricielle par exemple) / interdire un certain ordre
    Je ne vois pas de problèmes. J'ai systématiquement tous les opérateurs que je peux non membre.

  3. #23
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Bon, ok, je n'aurais pas du être aussi affirmatif C'est en tout cas la forme qui est recommandé par plusieurs références

  4. #24
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 130
    Points : 33 063
    Points
    33 063
    Billets dans le blog
    4

  5. #25
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Avril 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Avril 2014
    Messages : 5
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par jo_link_noir Voir le message
    Personnellement je ne recommande pas de faire `return a+=b`. Ça à la fâcheuse tendance de désactiver la RVO ou de faire un copy-ctor plutôt plutôt qu'un move-ctor. Il vaut mieux le faire en 2 étapes.
    Sans mettre en doute ce propos, il appelle franchement à une explication/un example/un lien (le lien fourni ne donne pas d'explication sur ce point).

    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Tu me montres une multiplication de matrice implémentée comme ça et on regarde les allocations?
    C'est un peu tiré par les cheveux car la multiplication matricielle pour des matrices non-carrées ne peut pas être faite "sur place". L'operator*= ne devrait pas être implémenté. D'ailleurs il ne peut pas l'être si la matrice est templatée sur sa taille (cas fréquent pour les petites matrices). Pour une utilisation normale, non-suprenante (en place) de operator@= la déclaration de mintho carmo me semble tout à fait juste.

  6. #26
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par user019 Voir le message
    C'est un peu tiré par les cheveux car la multiplication matricielle pour des matrices non-carrées ne peut pas être faite "sur place". L'operator*= ne devrait pas être implémenté. D'ailleurs il ne peut pas l'être si la matrice est templatée sur sa taille (cas fréquent pour les petites matrices). Pour une utilisation normale, non-suprenante (en place) de operator@= la déclaration de mintho carmo me semble tout à fait juste.
    Dans l'utilisation normale, on a besoin de l'ancienne valeur jusqu'au bout, ce n'est que dans des cas particuliers qu'il y a une séquence qui permette de modifier l'ancienne valeur sans la sauver en tout en en partie. Et encore plus particulier quand on peut composer l'ancienne valeur avec elle même... Une forme canonique doit fonctionner dans tous les cas, et pas être une optimisation parfois applicable.

  7. #27
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par user019 Voir le message
    C'est un peu tiré par les cheveux car la multiplication matricielle pour des matrices non-carrées ne peut pas être faite "sur place". L'operator*= ne devrait pas être implémenté. D'ailleurs il ne peut pas l'être si la matrice est templatée sur sa taille (cas fréquent pour les petites matrices). Pour une utilisation normale, non-suprenante (en place) de operator@= la déclaration de mintho carmo me semble tout à fait juste.
    Comme tu le mentionnes, @= ne pose pas de problème sur les matrices carrées (et mine de rien ça couvre quand même pas mal de cas d'utilisation)
    Et même sur les autres, tu as effectivement un blocage si tu représentes la matrice M*N par un tableau statique bidimensionnel de M*N. Mais il y a nombre de représentation où tu peux implémenter @= sans souci problème.

    Maintenant, si l'exemple de multiplication de matrice te pose problème, prends la multiplication de nombres complexes, le souci est le même (même s'il est largement plus simple à résoudre).


    Le point est que dans nombres de cas tu as des membres où modifications et utilisations se chevauchent.

  8. #28
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 746
    Points : 3 667
    Points
    3 667
    Par défaut
    Citation Envoyé par user019 Voir le message
    Sans mettre en doute ce propos, il appelle franchement à une explication/un example/un lien (le lien fourni ne donne pas d'explication sur ce point).
    Je suis désolé mais je n'ai pas de lien* expliquant bien ceci. Par contre, tu peux en déduire que la RVO s'applique sur les types non référencés et comme += retourne une référence elle ne s'applique pas ici.

    * Juste un exemple (operator+ en 1 ligne, operator- en 2)

    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
    #include <iostream>
     
    struct A {
      A() = default;
      A(const A&) { std::cout << "copy\n"; }
      A(A&&) { std::cout << "move\n"; }
    };
     
    A& operator += (A& a, A const & b)
    { return a; }
     
    A operator + (A a, A const & b)
    { return a += b ; }
     
    A& operator -= (A& a, A const & b)
    { return a; }
     
    A operator - (A a, A const & b)
    {
      a -= b ;
      return a;
    }
     
    int main() {
      A a;
      A b;
      {
        std::cout << "--------\n";
        A c = a+b;
        std::cout << "--------\n";
      }
      {
        std::cout << "--------\n";
        A c = a-b;
        std::cout << "--------\n";
      }
    }
    --------
    copy
    copy
    --------
    --------
    copy
    move
    --------
    avec -fno-elide-constructors (pour désactivé la rvo)

    --------
    copy
    copy
    move
    --------
    --------
    copy
    move
    move
    --------

Discussions similaires

  1. Passage par référence et retour de fonction
    Par mister3957 dans le forum Langage
    Réponses: 2
    Dernier message: 16/05/2015, 13h12
  2. Reference et retour de fonction par valeur
    Par shadowsam dans le forum C++
    Réponses: 4
    Dernier message: 19/03/2011, 17h39
  3. Référence en retour de fonction, à transformer en hash
    Par raoulchatigre dans le forum Langage
    Réponses: 4
    Dernier message: 15/07/2005, 14h24
  4. retour d'objet par référence...
    Par sas dans le forum C++
    Réponses: 15
    Dernier message: 28/05/2005, 17h54
  5. Réponses: 10
    Dernier message: 03/03/2005, 13h36

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