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 :

Passage de paramètre par valeur ou par const référence ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut Passage de paramètre par valeur ou par const référence ?
    En régle générale, je suppose qu'il vaut mieux passer des objets "lourds" en paramètre de fonction par référence. Mais n'y-a-t-il pas des cas où c'est mieux de les passer par valeur ? (dans les deux cas je pense à un usage read only)

    Par exemple, il me semble inutile de passer un int par référence (ou tout type de base). Mais quid pour des objets légers comme un smart pointer ou l'habituel std::string ?

    Dans le cas du smart pointer par exemple, le passage par valeur va induire une copie (avec incrémentation dans le cas d'un shared_ptr par exemple) bien souvent inutile. Le passage par référence, lui, va provoquer une indirection supplémentaire à chaque accès à un des membres de l'objet pointé.
    En général je passe les paramètres par const référence la plupart du temps, mais je doute que se soit toujours le plus efficace.

    Merci.

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Il me semble qu'il est vaguement admis qu'un passage par référence ne se justifie pas pour un objet d'une taille de < 8 ou 12 octets, mais qu'au-delà, on gagne à passer par référence constante.

    Typiquement, un std::string doit être passé par référence constante.

    Pour le shared_ptr, ce n'est plus tout à fait pareil. Si tu le passe par copie, tu peux modifier l'objet pointé, si tu le passe par référence constante, tu ne peux plus. Tu as une différence de sémantique, en plus de la problématique de performance.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Pour le shared_ptr, [...] si tu le passe par référence constante, tu ne peux plus.
    Es-tu sûr de ça?
    Car ça me parait beaucoup trop facile à casser pour être un mécanisme de const-correctness...
    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.

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Es-tu sûr de ça?
    Car ça me parait beaucoup trop facile à casser pour être un mécanisme de const-correctness...
    Après vérification... Tu as raison

    Du coup... Avant, je faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int f(const T* const param)
    { ... }
    Je fais comment avec un smart pointer ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Généralement, les smart pointers qui supportent la const-correctness permettent ceci:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int f(shared_ptr< const T > param);
     
    int main(void)
    {
    	shared_ptr< T > spObj(new T());
    	return f(spObj);
    }
    C'est sans doute la raison pour laquelle le standard C++ autorise le delete sur un pointeur const: Pour les cas où le dernier pointeur est un pointeur const...
    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.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Je vais avoir une réponse de normand, mais...

    Pour moi, dés le moment où tu veux passer autre chose qu'un type primitif en argument, il y a lieu de le passer sous la forme d'une référence (constante si la fonction ne doit pas le modifier).

    Il ne me semble pas opportun de s'inquiéter de "l'efficacité" du procédé tant que tu n'a pas la preuve (grâce à un profiling complet) que cela occasion un "goulot d'étranglement".

    Et, même si l'utilisation d'une référence constante est mise en évidence dans un goulot d'étranglement, il me semble bien plus opportun de s'assurer de l'efficacité "optimale" de l'algorithme qui le provoque avant d'aller chercher du côté de celle de l'efficacité de la référence constante.

    Ce ne sera vraiment que lorsque tu aura la certitude de ne plus pouvoir améliorer l'algorithme et pour autant que tu remarque encore (profiling à l'appuis) qu'il est encore nécessaire d'améliorer les choses qu'il sera alors temps de s'inquiéter de cette référence (constante ou non)
    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

Discussions similaires

  1. [template] passer un argument par valeur ou en const &
    Par méphistopheles dans le forum C++
    Réponses: 33
    Dernier message: 04/07/2010, 19h46
  2. [vocabulaire] passage par adresse et par valeur.
    Par debutantenalgo dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 21/12/2009, 15h42
  3. Passage par valeur ou par adresse
    Par BlackMulet dans le forum Langage
    Réponses: 6
    Dernier message: 29/10/2009, 16h20
  4. Passage de paramètre à un fichier AS par un bouton
    Par Lilliputien dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 26/11/2008, 12h40
  5. Passage par adresse ou par valeur ?
    Par Maverick27 dans le forum Débuter
    Réponses: 7
    Dernier message: 08/10/2008, 18h53

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