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

Boost C++ Discussion :

smart_ptr : shared vs intrusive


Sujet :

Boost C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    R�dacteur
    Avatar de bafman
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par d�faut smart_ptr : shared vs intrusive
    depuis quelques temps, je me suis mis � utiliser les smart_ptr de boost (bien ). jusqu'� pr�sent, j'ai toujours utilis� les shared_ptr car c'�tait les seuls pour lequels j'avais trouv� des exemples d'utilisation. Et puis, dernierement, j'ai decouvert l'existence des intrusive_ptr (ou plut�t, j'ai enfin compris comment ils fonctionnaient ).
    Le truc, c'est qu'en lisant la doc, je suis tomb� sur ca :
    As a general rule, if it isn't obvious whether intrusive_ptr better fits your needs than shared_ptr, try a shared_ptr-based design first.
    mais pourquoi donc ?
    certe, l'utilisation des intrusive_ptr obligent � avoir un ref count et des fonctions en plus, mais du coup, on a plus besoin d'heriter de enable_shared_from_this quand on veut passer un pointeur this � un autre objet.
    Le plus gros probl�me que je voit � cette approche est l'augmentation de la taille de la classe, ce qui n'est pas forcement id�ale dans le cas de petites classes (mais alors vraiment tr�s petite ), et d'ailleurs, cet aventage est perdu si je doit heriter de enable_shared_from_this...

    bref, le sujet du jour est :
    - les shared_ptr c'est naze ?
    - les intrusive_ptr c'est le mal ?
    les pour et les contres (car la, j'ai vraiment du mal a choisir, et je ne sait pas si il faut que je passe au intrusive_ptr dans mon projet actuel, sachant que j'ai de plus en plus de classes qui heritent de enable_shared_from_this et que ca commence a franchement me fatiguer , en bref, pour moi, le choix n'est vraiment pas obvious pour reprendre le terme de la doc de boost )
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les r�ponses pertinentes
    Mes articles

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    A priori intrusive_ptr a aussi l'avantage qu'il peut �tre plus performant dans un environnement multi-thread�.

  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
    Je pense que l'int�ret des shared_ptr<> sur les intrusive_ptr<> est d'�viter de trop modifier la classe point�e...
    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 chevronn�
    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
    Par d�faut
    Citation Envoy� par loufoque Voir le message
    A priori intrusive_ptr a aussi l'avantage qu'il peut �tre plus performant dans un environnement multi-thread�.
    Pourquoi?

  5. #5
    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 : 51
    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
    Par d�faut
    intrusive_ptr est adapt� quand on sait au moment o� l'on design la classe que toutes les instance de la classe seront g�r�es sous forme de pointeur avec comptage de r�f�rence. C'est en g�n�ral loin d'�tre la cas, c'est souvent plut�t l'utilisateur de la classe qui prend ce genre de d�cisions, pas son concepteur.
    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.

  6. #6
    Membre chevronn�
    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
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    intrusive_ptr est adapt� quand on sait au moment o� l'on design la classe que toutes les instance de la classe seront g�r�es sous forme de pointeur avec comptage de r�f�rence. C'est en g�n�ral loin d'�tre la cas, c'est souvent plut�t l'utilisateur de la classe qui prend ce genre de d�cisions, pas son concepteur.
    Oui, mais quand le concepteur de la classe d�rive de enable_shared_from_this, il prend d�j� une d�cision de "supporter" le comptage de r�f�rence de shared_ptr. C'est d�j� plus intrusif!

  7. #7
    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 : 51
    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
    Par d�faut
    Effectivement, si on a enable_shared_from_this, on est d�j� intrusif. Dans ce cas, je ne vois plus que 3 crit�res : intrusive_ptr est plus performant et peut �tre r�obtenu � partir d'un pointeur nu, shared_ptr est compatible avec weak_ptr.
    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.

  8. #8
    Membre chevronn�
    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
    Par d�faut
    Citation Envoy� par bafman Voir le message
    sachant que j'ai de plus en plus de classes qui heritent de enable_shared_from_this
    Pourquoi tes classes doivent-elles h�riter de enable_shared_from_this?

    Autrement dit : quel est le contrat que tes classes garantissent, et qui n�cessite enable_shared_from_this?

  9. #9
    Membre chevronn�
    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
    Par d�faut
    Citation Envoy� par bafman Voir le message
    Et puis, dernierement, j'ai decouvert l'existence des intrusive_ptr (ou plut�t, j'ai enfin compris comment ils fonctionnaient ).
    Comment tu as fais? Pas en lisant la doc je pense?

    Tu peux nous expliquer ce que fait enable_shared_from_this, et en quoi c'est une bonne solution � quel probl�me?

    Citation Envoy� par bafman Voir le message
    certe, l'utilisation des intrusive_ptr obligent � avoir un ref count et des fonctions en plus, mais du coup, on a plus besoin d'heriter de enable_shared_from_this quand on veut passer un pointeur this � un autre objet.
    Le plus gros probl�me que je voit � cette approche est l'augmentation de la taille de la classe, ce qui n'est pas forcement id�ale dans le cas de petites classes (mais alors vraiment tr�s petite ), et d'ailleurs, cet aventage est perdu si je doit heriter de enable_shared_from_this...
    Avant de passer aux micro-optimisations, il faudrait pr�ciser les contraintes impos�es aux classes. (D'ailleurs, dans boost, enable_shared_from_this contient un weak_ptr qui contient deux pointeurs, donc c'est plus gros qu'un compteur de r�f�rence.)

    Citation Envoy� par bafman Voir le message
    bref, le sujet du jour est :
    - les shared_ptr c'est naze ?
    - les intrusive_ptr c'est le mal ?
    La question est mal pos�e, �videmment. Ce qu'il faut que tu d�cides, c'est si toutes les instances de ta classe doivent �tre allou�es dynamiquement, et �tre g�r�es par un syst�me de smart pointer donn�. (Il faut penser en terme de besoins et pas de composants standards.)

  10. #10
    Membre chevronn�
    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
    Par d�faut std::enable_shared_from_this
    Toujours � propos de enable_shared_from_this, voici quelque chose de savoureux :
    Citation Envoy� par N2315, 20.6.6.4/14 [util.smartptr.enab]
    The shared_ptr constructors that create unique pointers can detect the presence of an enable_shared_from_this base and assign the newly created shared_ptr to its __weak_this member. �end note ]
    Et comment pourrait-il le faire? La classe de base enable_shared_from_this peut �tre inaccessible ou bien ambig�e (ou les deux). Par d�finition, il n'est pas possible de tester si une classe de base est inaccessible ou ambig�e.

  11. #11
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    C'est pour cela qu'il vaut mieux toujours d�river de mani�re public de enable_shared_from_this.

  12. #12
    Membre chevronn�
    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
    Par d�faut enable_shared_from_this
    Citation Envoy� par Matthieu Brucher Voir le message
    C'est pour cela qu'il vaut mieux toujours d�river de mani�re public de enable_shared_from_this.
    Si c'est requis quelque part, je ne l'ai pas vu. Si �a ne l'est pas, l'impl�mentation doit faire fonctionner :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class B;
    class A : enable_shared_from_this<B> {};
    class B : A, enable_shared_from_this<B> {};
     
    shared_ptr<B> p (new B);

Discussions similaires

  1. [VB.NET][C#] Equivalence Shared
    Par MALAGASY dans le forum Windows Forms
    R�ponses: 7
    Dernier message: 10/01/2005, 12h12
  2. Share memory
    Par beLz dans le forum C
    R�ponses: 5
    Dernier message: 21/12/2004, 00h50
  3. [Oracle 8i][Internet] Shared Pool Size
    Par dupin40 dans le forum Administration
    R�ponses: 39
    Dernier message: 04/11/2004, 12h39
  4. [CR] variables shared
    Par rkampf dans le forum Formules
    R�ponses: 4
    Dernier message: 08/04/2004, 19h28
  5. R�ponses: 2
    Dernier message: 05/02/2004, 13h58

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