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 :

shared_ptr en paramètre par référence ou par copie ? 


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut shared_ptr en paramètre par référence ou par copie ? 
    J’ai cette question qui me revient souvent.

    A chaque fois que je passe un pointeur partagé en paramètre je me demande si je dois le faire passé par référence.

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Toto(std::shared_ptr<Lala>& lala)
    {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Toto(std::shared_ptr<Lala> lala)
    {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Toto(const std::shared_ptr<Lala>& lala_const)
    {}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Toto(const std::shared_ptr<Lala> lala_const)
    {}
    etc


    Quel raisonnement suivez-vous/conseillez-vous pour faire votre choix?

  2. #2
    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
    Dans tous les cas l'objet lui-même ne sera pas copié.
    Je dirais passe le shared_ptr par copie tant que tu n'as pas passé ton code au profileur et déterminé que cet appel de fonction était performance-critical.
    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.

  3. #3
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    De mon point de vu:
    Il faut le passer en copie et non en référence. Le but des shared_ptr, est de pointer le nombre de référence dans chaque contexte, comme tu appelles une nouvelle fonction, tu augmente le nombre de contexte, donc on incrémente .
    Imaginons que tu décides de threader ton appel de fonction, si tu le passes en référence, tu pourrais avoir des surprises ^^
    D'autant plus qu'une copie d'un shared_ptr est très peu couteuse en cpu, donc pas trop de raison de vouloir changer ça

    Ne jamais oublier "KISS"

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    De base, le passage par référence tu oublies direct. Ce truc est là uniquement pour modifier le paramètre dans la fonction pour l'appelant.

    Maintenant que l'on sait que la bataille se situe entre const& et copie, on y réfléchit 2 minutes.
    Est-ce que la fonction ne fait qu'utiliser le paramètre sans le toucher ? Parfait, il peut être const&, son passage sera optimisé et l'appelant n'aura aucune surprise.
    Est-ce que la fonction modifie le paramètre en interne ? Alors tu demandes une copie. La copie aura pour effet que l'appelant pourra move sa variable si possible et donc aucune copie ne sera faite.

    Le cas de shared_ptr est un peu plus subtil parce que c'est le shared_ptr qui serait copié ou const mais pas son objet interne. Mais cette copie coûte avec le compteur de référence, ce qui peut être non négligeable.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Le cas de shared_ptr est un peu plus subtil parce que c'est le shared_ptr qui serait copié ou const mais pas son objet interne. Mais cette copie coûte avec le compteur de référence, ce qui peut être non négligeable.
    La création d'un shared_ptr par copie et donc incrémentation du compteur de référence est vraiment dimensionnant en terme de cout cpu? (Je connais pas trop, j'ai pas regarder les bench la dessus donc je pose la question ^^)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Sur TotoProject sûrement pas, sur un vrai projet où tu as potentiellement des centaines/milliers de ces trucs et du code exécuté sur plusieurs threads et cores...
    Ça a beau s'améliorer, utiliser des atomic, intrinsics etc, ça reste un moment un truc alloué et synchronisé.
    La différence entre 30fps et 60fps c'est ~16ms/frame, c'est (très) peu et tout compte.

    Le mieux étant de ne pas utiliser de shared_ptr.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  2. Passage par copie vs passage par référence
    Par bolhrak dans le forum C++
    Réponses: 11
    Dernier message: 20/08/2006, 23h37
  3. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  4. [C#] Envoie des paramètres par référence
    Par efficks dans le forum C#
    Réponses: 4
    Dernier message: 29/11/2005, 23h53
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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