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 397
    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 397
    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 397
    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 397
    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 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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