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 :

Différence entre deux fonctions


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut Différence entre deux fonctions
    Quelle différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool SDbTypeInfoByTypeSortPred(const S2t * rti1,const S2t * rti2)
    {
    return rti1->s_int<rti2->s_int;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool SDbTypeInfoByTypeSortPred(const S2t * const & rti1,const S2t * const & rti2)
    {
    return rti1->s_int<rti2->s_int;
    }
    ?

    A priori aucune. Correct ? En tout cas ça compile et s'exécute de la même manière.
    Mais j'en reste perturbé...

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    1er code: tu passe des pointeurs constants.
    2eme : tu passe des références constantes sur des pointeurs constants.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations professionnelles :
    Activité : aucun

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

    La première va travailler avec un pointeur sur un élément constant de type S2t alors que la seconde va travailler avec un référence constante sur un pointeur élément constant de type S2t

    Si différence il y a, c'est au niveau de la manière de considérer l'argument:
    Dan la première version, l'argument est une variable locale et, les modifications en ce qui concerne le pointeur ne seront de toutes manières pas répercutées sur le pointeur original (hormis la libération de la mémoire allouée dynamiquement qui reste tout à fait possible).

    Dans la deuxième, l'argument est un alias, ce qui évite éventuellement la copie (du pointeur, non de l'objet pointé... mais est-ce réellement utile ), mais qui nécessite d'être "blindé" pour éviter que les modification (hormis la libération de la mémoire allouée dynamiquement, qui reste possible) ne se répercutent sur le pointeur passé en paramètre.
    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
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    1er code: tu passe des pointeurs constants.
    Non, tu passe un pointeur sur un objet constant (tu peux modifier l'adresse à laquelle fait référence le pointeur, mais pas l'objet pointé)
    2eme : tu passe des références constantes sur des pointeurs constants.
    non, tu passe une référence constante sur un pointeur vers un objet constant: s'agissant d'une référence constante, tu ne peux plus modifier l'adresse pointée par le pointeur
    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

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    En pratique, j'ai un std::vector<S2t *> (pointeurs vers S2t) et la fonction est utilisée comme prédicat de la fonction std::sort() par exemple.

    Pour faire du code "propre", laquelle des deux écritures devrais-je utiliser ?
    Je dirais la deuxième (?)

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Non, tu passe un pointeur sur un objet constant (tu peux modifier l'adresse à laquelle fait référence le pointeur, mais pas l'objet pointé)
    non, tu passe une référence constante sur un pointeur vers un objet constant: s'agissant d'une référence constante, tu ne peux plus modifier l'adresse pointée par le pointeur
    Mon dieu ><.
    Ya des jours où il faudrais mieux rester couché.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    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
    Citation Envoyé par koala01 Voir le message
    Non, tu passe un pointeur sur un objet constant (tu peux modifier l'adresse à laquelle fait référence le pointeur, mais pas l'objet pointé)
    non, tu passe une référence constante sur un pointeur vers un objet constant: s'agissant d'une référence constante, tu ne peux plus modifier l'adresse pointée par le pointeur
    Un truc qui me chagrine : pour moi parler de référence constante n'a aucun sens puisque une référence est par définition toujours constante.
    Donc pour le deuxième cas je dirais plutôt que l'on passe une référence sur un pointeur constant vers un objet constant

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Si, ça a un sens: Le sens de taper moins de mots.
    "pointeur constant" et "référence constante" sont certes des abus de langages, mais ce sont des abus de langages courants.

    Généralement, j'utilise plutôt "pointeur const" qui est plus clair dans mon esprit, mais pas forcément dans celui des autres...

    Quant à la façon "propre" de tester le prédicat pour un tableau de S2t*, je dirais que c'est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool predicat(S2t* x, S2t* y)
    {
       ...
    }
    ou ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool predicat(S2t* const & x, S2t* const & y)
    {
       ...
    }
    Parce que le code que tu as donné fait une conversion implicite de S2t* en S2t const *, donc dans ta seconde forme, la "référence constante" ne référence pas le pointeur lui-même, mais un temporaire non-nommé (du moins, en théorie).
    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 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
    Citation Envoyé par Médinoc Voir le message
    Si, ça a un sens: Le sens de taper moins de mots.
    "pointeur constant" et "référence constante" sont certes des abus de langages, mais ce sont des abus de langages courants.

    Généralement, j'utilise plutôt "pointeur const" qui est plus clair dans mon esprit, mais pas forcément dans celui des autres...

    Quant à la façon "propre" de tester le prédicat pour un tableau de S2t*, je dirais que c'est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool predicat(S2t* x, S2t* y)
    {
       ...
    }
    ou ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool predicat(S2t* const & x, S2t* const & y)
    {
       ...
    }
    Parce que le code que tu as donné fait une conversion implicite de S2t* en S2t const *, donc dans ta seconde forme, la "référence constante" ne référence pas le pointeur lui-même, mais un temporaire non-nommé (du moins, en théorie).
    En quoi pointeur constant est un abus de langage ?

    Sinon pour le reste je suis d'accord avec toi.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    L'expression "pointeur constant" est un abus de langage quand elle désigne un "pointeur vers objet constant"...
    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.

  11. #11
    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
    Citation Envoyé par Médinoc Voir le message
    L'expression "pointeur constant" est un abus de langage quand elle désigne un "pointeur vers objet constant"...
    Ok, là je suis d'accord avec toi.

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Merci à tous pour vos réactions.

    J'ai décidé d'utiliser la deuxième forme même si elle est plus "lourde". C'est une manière d'indiquer dans le code qu'elle sera utilisée comme prédicat à l'usage de la STL.

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    La deuxième forme n'indique rien du tout vis-à-vis de la STL, au contraire, la STL privilégie souvent le passage par valeur.

    C'est comme écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool compare(int const& a, int const& b);
    plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool compare(int a, int b);
    C'est plus long à taper, potentiellement moins rapide, et pas très idiomatique.

  14. #14
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Je ne voulais pas dire que c'était une indication pour le compilateur mais pour le lecteur du code source (moi en l'occurrence, lorsque je me relis).

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

Discussions similaires

  1. Fonction pour calculer la différence entre deux dates à base 360j
    Par messi1987 dans le forum Développement
    Réponses: 11
    Dernier message: 11/09/2018, 11h17
  2. attendre 1 seconde entre deux fonctions
    Par urousseau dans le forum C++Builder
    Réponses: 8
    Dernier message: 08/06/2008, 19h14
  3. Différence entre deux dates
    Par pittzz dans le forum Oracle
    Réponses: 5
    Dernier message: 18/07/2005, 12h24
  4. Comment obtenir la différence entre deux dates ?
    Par jbat dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2005, 09h34
  5. Résultats erroné différence entre deux types TDateTime
    Par Alghero dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/03/2004, 17h03

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