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 :

La fonction operator+ n’est pas optimisée ?! (question d'un débutant)


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut La fonction operator+ n’est pas optimisée ?! (question d'un débutant)
    salut les amis,
    j'ai trouvé dans un livre (Mieux programmer en c++ - Herb suter ) que le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void operator+ ( Complex other)
    {
    _real = _real + other._real;
    _imaginary = _imaginary + other._imaginary;
    }
    n'est pas optimisé,et Il aurait fallu, pour une meilleure efficacité, passer une référence constante plutôt qu’une valeur.
    donc d'écrire: void operator+ ( Complex const& other)

    mais d'après le cours le mot const signifie que l'on ne peut pas modifier l'objet! donc le _real et le _imaginary ne seront pas changés !?

  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
    Il s'agit là d'une fonction membre. Le _real et _imaginary de other ne seront pas changés, mais rien n'empêche de modifier le _real et _imaginary de l'objet courant (le this).

    Sinon, le code montré me semble étrange. Tu es sûr de bien avoir copié ?
    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 du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    je n'ai pas fait attention,merci.

    oui et je pense que c'est ca le but de l'exercice :
    Images attachées Images attachées  

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par DLOYAS Voir le message
    j'ai trouvé dans un livre (Mieux programmer en c++ - Herb suter ) que le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void operator+ ( Complex other)
    {
    _real = _real + other._real;
    _imaginary = _imaginary + other._imaginary;
    }
    n'est pas optimisé,et Il aurait fallu, pour une meilleure efficacité, passer une référence constante plutôt qu’une valeur.
    Bof
    1. Tu peux déclarer ta méthode "inline": le compilateur devrait le faire sans rechigner.
    2. Peut-être que le compilateur peut optimiser dans certains cas à ta place.
    3. Au pire ta classe ce sont au plus 2 double: ce n'est pas bien méchant, si tu fais peu d'additions.
    4. C'est un code d'exemple. Donc question optimisation on s'en fiche




    Citation Envoyé par DLOYAS Voir le message
    donc d'écrire: void operator+ ( Complex const& other)
    mais d'après le cours le mot const signifie que l'on ne peut pas modifier l'objet! donc le _real et le _imaginary ne seront pas changés !?
    Relis ton cours un peu mieux

    Il y a une différence entre void operator+ (Complex const& other) (et ses variantes) et void operator+ (Complex& other) const

  5. #5
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    foetus: pouvez vous m'expliquer la différence svp ?

  6. #6
    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
    Mouais, ça continue à me sembler louche... Mais c'est normal ! Il explique plus loin que l'opérator + est mal écrit, devrait retourner un complexe, ne pas modifier l'objet courant (et d'ailleurs être en dehors de la classe).
    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.

  7. #7
    Membre du Club
    Homme Profil pro
    12
    Inscrit en
    Mai 2014
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : 12
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 67
    Points : 61
    Points
    61
    Par défaut
    Merci,

  8. #8
    Membre éclairé

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par foetus Voir le message
    1. Tu peux déclarer ta méthode "inline": le compilateur devrait le faire sans rechigner.
    HS : manifestement, c'est une fonction membre définie dans la définition de la classe. Donc la fonction est implicitement inline, il n'est pas nécessaire d'ajouter "inline"

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce code, c'est un opérateur += déguisé en opérateur +. C'est une horreur innommable et tout programmeur C++ écrivant ça devrait être banni de tout contact avec un ordinateur.
    Imagine un peu, écrire ça:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Complex a(1, 1);
    Complex b(2, 2);
     
    Complex c = a + b; //BOUM!
    Et là, sans le savoir, tu as modifié a!

    Edit: Apparemment, si j'ai bien compris, il s'agit d'un exemple de "mauvais" code à corriger. Le problème, c'est que la "solution" est tout aussi mauvaise. (mais la version corrigée est bonne, vu qu'elle s'appelle operator+=).
    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.

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il y a pas mal d'imperfections oui, voire des erreurs:
    - mauvaise sémantique de op+ (déjà signalé)
    - ostream n'est pas copiable, et la signature de l'opérateur d'insertion (op<<) est totalement à l'ouest
    - op+ devrait être libre et éventuellement prendre le premier paramètre par copie (pour des questions d'optimisation)
    - incrémenter (de un) un complexe n'a aucun sens! (d'autant que la représentation interne repose sur des doubles) De plus l'incrément préfixé devrait renvoyer une référence
    - je rajouterai aussi que l'on évite en général de préfixer par un tiret-bas en C++, cf la FAQ -- il cependant vrai qu'ici il ne devrait pas y avoir de conflit possible
    - les nombres complexes, je ne les écris pas "(5,2)", mais "5+2i"
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    [troll]
    Citation Envoyé par Luc Hermitte Voir le message
    - les nombres complexes, je ne les écris pas "(5,2)", mais "5+2i"
    "(5,2)" est également correct puisque est un espace vectoriel.
    [/troll]

    Plus sérieusement, cela dépend sûrement du passé universitaire de M. Sutter et de l'époque, la convention n'est peut-être pas la même partout.
    Find me on github

  12. #12
    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
    De mes maigres souvenirs de pédagogie, donner des exemples avec des erreurs à corriger est généralement mal venu, on se souvient qu'on a vu la forme problématique, on oublie les critiques qui ont suivi. Mon premier point serait "pourquoi ne pas utiliser la classe std::complex ?"

    Citation Envoyé par Luc Hermitte Voir le message
    - je rajouterai aussi que l'on évite en général de préfixer par un tiret-bas en C++, cf la FAQ -- il cependant vrai qu'ici il ne devrait pas y avoir de conflit possible
    Il est passé au souligné final pour la solution, je parie que c'est un des points traités dans le texte, comme la plupart des problèmes.

    Le souligné initial suivi par une minuscule pour les noms de membres est le seul cas que je retiens comme exception possible (mais que je n'emploie pas, elle est juste trop courante pour que je ne la retienne pas) à la règle "pas de souligné initial, pas de double souligné".
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'avais ressorti mon exemplaire de XC++ après avoir répondu. Et le seul truc (pertinent j'ai envie de dire) que je critique en plus : l'incrémentation de 1 sur les complexes qui n'a pas de sens.

    Pour std::complex, tu as parfaitement raison, après, il faut prendre l'item comme un rappel des bonnes pratiques dans ces classes.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  14. #14
    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
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Mon premier point serait "pourquoi ne pas utiliser la classe std::complex ?"
    De mémoire, c'est aussi la première remarque qu'il fait dans le livre.
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction arithmétique (pas une question)
    Par bubuche87 dans le forum C
    Réponses: 3
    Dernier message: 16/01/2008, 22h15
  2. Couleur de fond d’un page qui n’est pas une page mais juste
    Par Furius dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/01/2006, 17h16
  3. Le fichier xxx.xxx n’est pas une image Windows32 valide
    Par Furius dans le forum Windows XP
    Réponses: 7
    Dernier message: 12/12/2005, 21h25
  4. fonction operator, valeur de retour
    Par butch dans le forum C++
    Réponses: 21
    Dernier message: 20/09/2004, 10h30

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