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 :

mot cle const


Sujet :

C++

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Si je me souviens de mes vieux cours mon prof nous avait simplement expliqué que déclarer un opérateur dans la classe obligeait à placer la seconde opérande à droite de l'instance courante, ça m'a largement suffit pour comprendre le fonctionnement et je ne suis jamais étonné du comportement d'un opérateur. Il ne faut pas être un gourou en la matière pour ne jamais faire d'erreur d'interprétation du code.
    Aussi je suis un peu étonné de vous voir prêcher comme un vérité quelque chose qui n'est jamais que... très subjectif.
    Par contre vous avez complètement éclipsés ma remarque sur la constance de l'opérande de gauche ce qui est tout de même un peu plus important (car ça ça change la sémantique).
    Dans le cas d'une surcharge interne, ta remarque sur la constance de l'opérande de gauche est judicieuse en effet.
    Pour ce qui est de la surcharge externe, il ne s'agit pas de prêcher une espèce de vérité comme tu dis, mais juste de proposer un modèle plus cohérent à l'opération +. De plus, si dans le fond, la surcharge interne ou externe ne change pas fondamentalement, en pratique, la surcharge externe des opérateurs symétriques est plus avantageuse.
    En effet, avec un opérateur + externe, si un transtypage d'un des deux opérandes doit être réalisé, il peut l'être aussi bien sur l'opérande de gauche que sur l'opérande de droite.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class B {
          /* ... */    
    };
     
    class A {
          friend A operator+(const A&, const A&);
     
          public:
            A(const B&);  
          /* ... */      
    };
    On peut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A var1;
    B var2;
     
    A var3 = var2 + var1; // <=> A var3 = var1 + var2;
    Ce qui est moins aisé avec une surcharge interne de l'opérateur +...

  2. #22
    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
    La "libération" des opérateurs binaires est liée au besoin de symétrie quand des conversions implicites sont possibles.
    C'est tout.
    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...

  3. #23
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par zais_ethael Voir le message
    Aussi je suis un peu étonné de vous voir prêcher comme un vérité quelque chose qui n'est jamais que... très subjectif.
    Il existe des cas où définir les opérateurs arithmétiques en dehors de la classe est plus utile qu'à l'intérieur. L'inverse n'est pas vrai. -> Autant prendre des bonnes habitudes. En tout cas il ne s'agit pas de superstition.

  4. #24
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Pourquoi toujours? Passer des int, float,... par références améliore les performances?
    Ce n'est pas pour une raison de performances que ce serait plus intéressant, même s'il y a cet avantage en plus. C'est intéressant pour des raisons de suretés qui rejoignent le comportement qu'on obtient avec des paramètres de fonctions en mathématiques. Le fait qu'il n'y ait aucun intérêt au niveau de la performance pour int et float ne dérange en rien. Ce qui compte c'est qu'il n'y ait pas de désagréments et de problèmes cachés, ce qui est le cas.

    Citation Envoyé par babar63 Voir le message
    [...]
    Pour moi le const est utilisé pour associer une propriété à une donnée et non comme un moyen plus sûr, il permet une meilleur lecture du code, (d'ailleurs si je ne me trompe pas le compilateur apprécie aussi ) ... Mais ça c'est une question de point de vue je suppose
    Le fait qu'il te permette une meilleure lecture du code est aussi un moyen d'améliorer la sureté et la fiabilité. Donc je réitère : selon moi il eut été bon que le comportement par défaut soit de passer une référence constante et qu'il existe un moyen de faire une copie mais en l'explicitant.

  5. #25
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Le fait qu'il n'y ait aucun intérêt au niveau de la performance pour int et float ne dérange en rien.
    Il y a meme perte de performance pour ces types.

  6. #26
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Ceci dit, le fait de passer un argument sous forme de référence constante doit être mis en parallèle avec les méthodes constantes et le retour constant de méthode.

    C'est l'ensemble qui nous permet de passer une sorte de contrat par lequel nous nous engageons à ne pas modifier un objet, et qui permet au compilateur de veiller à ce que nous tenions nos engagements.

    Et le but premier n'est pas de signaler au lecteur que telle ou telle fonction ou variable ne va pas modifiier l'objet, mais bel et bien de permettre ce genre de contrat

    Il y a, bien sûr, moyen de renoncer temporairement au contrat de constance des objets avec le const_cast, mais, de manière générale, il reste beaucoup plus prudent pour tout le monde de s'en tenir aux engagement pris
    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

  7. #27
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par koala01 Voir le message
    [...]
    Et le but premier n'est pas de signaler au lecteur que telle ou telle fonction ou variable ne va pas modifiier l'objet, mais bel et bien de permettre ce genre de contrat [...]
    C'est pour cela que je dis que c'est gage de sureté et que cela aurait du être généralisé.

    Cependant dire qu'il y a un but premier et second c'est faire une interprétation de la volonté du créateur (avec un petit ‘c’, car celui avec une majuscule est encore plus inatteignable )

    Je pense que les deux objectifs sont là car le contrat est visible par le lecteur qui comprend donc ce qui se passe.

  8. #28
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Il y a meme perte de performance pour ces types.
    Oui mais c'est tellement négligeable que ça n'a aucun intérêt (c'est bien ce que j'ai dit).

  9. #29
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    C'est négligeable pour toi surement, mais pour des personnes qui font de l'optimisation de code, avec une fonction qui est appellée plusieurs millions de fois c'est plus négligeable.

  10. #30
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    C'est négligeable pour toi surement, mais pour des personnes qui font de l'optimisation de code, avec une fonction qui est appellée plusieurs millions de fois c'est plus négligeable.
    Cela reste négligeable même plusieurs millions de fois. Il est exceptionnel que le problème vienne du fait que tu as fait un passage par valeur d'un entier au lieu d'une référence constante; y compris en programmation de calcul intensif. Normalement les problèmes viennent d'ailleurs notamment de la conception. Le problème peut venir de millions d'appels d'une fonction récursive, mais dans ce cas le problème vient de la récursivité et non du passage d'argument. Une refactorisation s'impose. Sinon l'espace mémoire utilisé est sensiblement équivalent. Je serais curieux de voir un cas réel et non artificiel où le problème vient vraiment de là.

  11. #31
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    En fait, il ne s'agit pas de problème mais bien d'optimisation. Mais je suis d'accord, dans un plan d'optimisation, cela arriverait loin derriere bien d'autres considérations.

  12. #32
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    En fait, il ne s'agit pas de problème mais bien d'optimisation. Mais je suis d'accord, dans un plan d'optimisation, cela arriverait loin derriere bien d'autres considérations.
    Bin on est d'accord alors

  13. #33
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Oui mais c'est tellement négligeable que ça n'a aucun intérêt (c'est bien ce que j'ai dit).
    Tu as mesuré?

  14. #34
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par corrector Voir le message
    Tu as mesuré?
    Non. Je ne perdrais pas de temps pour ça.
    Je te laisse ce plaisir si ça te tente.

  15. #35
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par Garulfo Voir le message
    Il est exceptionnel que le problème vienne du fait que tu as fait un passage par valeur d'un entier au lieu d'une référence constante; y compris en programmation de calcul intensif.
    Tu veux dire : il est exceptionnel que le passage d'un entier par référence constante créé un problème de performance par rapport au passage par valeur?

  16. #36
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par corrector Voir le message
    Tu veux dire : il est exceptionnel que le passage d'un entier par référence constante créé un problème de performance par rapport au passage par valeur?
    Le sens contraire... ce que j'ai d'ailleurs dit « il est exceptionnel que le problème vienne du fait que tu as fait un passage par valeur d'un entier au lieu d'une référence constante ».

    Certes je n'ai pas vu tous les problèmes du monde... mais je doute très fort que quelqu'un qui ait de réels problèmes de performance (mémoire dans ce cas) puisse résoudre son problème uniquement par ce procédé. Je serais curieux qu'on me montre un tel problème réel (et non qui soit créé pour l'occasion).

  17. #37
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Il a été dit je ne sais plus où que le passage par référence constante n'est pas plus bénéfique que le passage par valeur pour les types dondamentaux. L'intérêt est moindre, voir nul.

  18. #38
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Pourquoi toujours? Passer des int, float,... par références améliore les performances?
    Citation Envoyé par Garulfo Voir le message
    Ce n'est pas pour une raison de performances que ce serait plus intéressant, même s'il y a cet avantage en plus. C'est intéressant pour des raisons de suretés qui rejoignent le comportement qu'on obtient avec des paramètres de fonctions en mathématiques. Le fait qu'il n'y ait aucun intérêt au niveau de la performance pour int et float ne dérange en rien. Ce qui compte c'est qu'il n'y ait pas de désagréments et de problèmes cachés, ce qui est le cas.
    Citation Envoyé par NiamorH Voir le message
    Il y a meme perte de performance pour ces types.
    Citation Envoyé par Garulfo Voir le message
    Oui mais c'est tellement négligeable que ça n'a aucun intérêt (c'est bien ce que j'ai dit).
    Citation Envoyé par NiamorH Voir le message
    C'est négligeable pour toi surement, mais pour des personnes qui font de l'optimisation de code, avec une fonction qui est appellée plusieurs millions de fois c'est plus négligeable.
    Citation Envoyé par Garulfo Voir le message
    Cela reste négligeable même plusieurs millions de fois. Il est exceptionnel que le problème vienne du fait que tu as fait un passage par valeur d'un entier au lieu d'une référence constante; y compris en programmation de calcul intensif. Normalement les problèmes viennent d'ailleurs notamment de la conception.
    Citation Envoyé par corrector Voir le message
    Tu veux dire : il est exceptionnel que le passage d'un entier par référence constante créé un problème de performance par rapport au passage par valeur?
    Citation Envoyé par Garulfo Voir le message
    Le sens contraire... ce que j'ai d'ailleurs dit « il est exceptionnel que le problème vienne du fait que tu as fait un passage par valeur d'un entier au lieu d'une référence constante ».
    Pour moi, il y a clairement un qui-pro-quo entre NiamorH et Garulfo.

    Ou alors entre vous tous et moi.

    (Il faudrait écrire "perte par rapport à" pour m'éviter ce genre de doutes...)

  19. #39
    Provisoirement toléré
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Points : 495
    Points
    495
    Par défaut
    Que ma thèse soit bien claire :

    void f (int);
    ne sera jamais moins efficace que

    void f (const int&);

  20. #40
    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
    La mienne est que je n'ai aucune idée a priori sur la performance comparée de :
    void f (char, char);

    Et
    void f (char const &, char const &);

    Mais que je ne serais pas surpris que la seconde soit légèrement plus longue.
    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.

Discussions similaires

  1. [debutant] le mot clé const
    Par r0d dans le forum Débuter
    Réponses: 12
    Dernier message: 21/06/2006, 16h13
  2. Recherche par mots cles
    Par Seth77 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2006, 15h58
  3. [deb]Mot cle tyledef complement d'info
    Par Marc_3 dans le forum C++
    Réponses: 9
    Dernier message: 11/12/2005, 22h12
  4. [Mots cles]Signification de transient et volatile
    Par Pill_S dans le forum Langage
    Réponses: 2
    Dernier message: 14/07/2004, 11h58

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