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 :

Utilisation agressive des shared_ptr


Sujet :

Boost C++

  1. #1
    En attente de confirmation mail
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    56
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 56
    Points : 52
    Points
    52
    Par défaut Utilisation agressive des shared_ptr
    Bonjour à tous.

    Intitulé explicite, n'est-ce pas ? ^^
    Donc voila peut-on utiliser les shared_ptr de boost sans ce privé ou faut-il seulement les utiliser quand c'est nécessaire ?

    Merci d'avance

  2. #2
    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
    Je dirais que comme toute technique, il ne faut l'utiliser que quand c'est nécessaire, c-à-d quand elle apporte quelque chose par rapport aux autres alternatives.

    Typiquement les shared_ptr s'utilisent, comme leur nom l'indique, pour gérer la durée de vie d'objets partagés. Mais il arrive qu'ils puissent servir dans d'autres contextes, par manque d'alternatives (auto_ptr a une sémantique bien spéciale), comme par exemple pour stocker des objets polymorphes dans des conteneurs.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux utiliser ce genre de pointeurs intelligents "sans te priver", je te conseillerais plutôt de le faire de manière intrusive: mettre un compteur de références dans tes objets et utiliser des intrusive_ptr<>...
    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
    Futur Membre du Club
    Inscrit en
    Mai 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Sachant que par définitions les shared_ptr sont des objets, leur utilisation rend ton programme plus lourd. Mais sur un sytème qui se respecte, ce type de contrainte, de nos jours, ne pose plus de problèmes.

    Il est préférable d'utiliser des shared_ptr que de se retrouver avec des espaces mémoires non désalloués par exemple.

  5. #5
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Personnellement je n'ai jamais trouvé l'intérêt de shared_ptr.
    Si je veux partager la propriété d'une donnée, j'utilise plutôt une flyweight factory (qui résout un certain nombre des problèmes de shared_ptr par ailleurs)
    Boost ftw

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Peux-tu donner des détails sur ce qu'est une flyweight factory ?
    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.

  7. #7
    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
    A tout hasard je dirais une composition entre 2 design pattern.
    Celui ci et celui
    "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)

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    J'ai essayé sans et avec uniquement des shared_ptr il y a quelques années, pour la même (grosse) application (un jeu vidéo).

    Ma conclusion est aussi qu'il ne faut l'utiliser qu'au moment ou on en sent le besoin.
    Au final il n'y a que dans un type de cas ou l'utilisation me semble la plus naturelle : pour les objets représentant des ressources potentiellement partagées par plusieurs système et qui ne sont pas "managés" au sens ou il n'y a pas un manager déjà présent qui "détient" ces resources et les détruira sur commande. L'utilisation d'un manager de cette manière m'est bien plus courante que l'utilisation du shared_ptr à vrai dire.

  9. #9
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Au final il n'y a que dans un type de cas ou l'utilisation me semble la plus naturelle : pour les objets représentant des ressources potentiellement partagées par plusieurs système et qui ne sont pas "managés" au sens ou il n'y a pas un manager déjà présent qui "détient" ces resources et les détruira sur commande. L'utilisation d'un manager de cette manière m'est bien plus courante que l'utilisation du shared_ptr à vrai dire.
    Chose pour laquelle tu ferais mieux d'utiliser par exemple Boost.Flyweight.
    Boost ftw

  10. #10
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Oui mais au final non : j'ai quasiment jamais d'instances similaires... Mais je suis au courant de l'existence de la lib et je compte l'essayer dés que j'ai un cas évident (ou peut être en phase d'optimisation)

  11. #11
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Salut,

    Citation Envoyé par loufoque Voir le message
    Si je veux partager la propriété d'une donnée, j'utilise plutôt une flyweight factory (qui résout un certain nombre des problèmes de shared_ptr par ailleurs)
    Citation Envoyé par loufoque Voir le message
    Chose pour laquelle tu ferais mieux d'utiliser par exemple Boost.Flyweight.
    Merci de m'avoir fait découvrir Boost.Flyweight.
    La Factory en question me rappelle pas mal la mutualisation des chaines de caractère en Java.

    Je m'interroge sur la différence entre ceci et un manager. Dans les deux cas tu donne la responsabilité de l'ensemble de tes objets à un seul objet extérieur qui les gère pour toi. Probablement dans les deux cas, l'objet en question les mutualise...

    Je rappelle que Herb Sutter et Andrei Alexandrescu ont une opinion très tranchée sur le sujet des shared_ptr

    Quand à moi, je crois qu'il faut que les objets qui sont responsable de la libération des pointeurs soient des objets dédiés. Pas forcément des shared_ptr ou des managers/mutualiseurs, mais des objets dédiés.

    Toutefois, je n'ai pas beaucoup d'exemple pour lesquels ni les shared_ptr, ni un manager/mutualiseur ne conviennent.

    Un seul exemple me vient : j'ai eu à coder il y a quelques années un serveur qui pouvait recevoir des message de :
    - plusieurs threads sur la même machines
    - plusieurs threads sur d'autres machines
    Tous devaient tous être traités de la même manière, et les messages étaient de types variés mais statiques.
    J'ai choisi que les threads d'une même machine communiqueraient entre eux en se passant des pointeurs d'objets "message", et j'ai du mettre en place pour cela un mécanisme d'allocation/libération de ressource pour ces messages qui était intimement lié à la couche de communication :
    Les messages ne pouvaient être créés que par un objet unique (par machine) de création de message et pouvaient être détruit :
    - soit par le thread qui envoie le message à une autre machine (sur les machines clients), après avoir vérifié qu'il avait été traité par le serveur.
    - soit par le thread serveur qui traite les message (sur la machine serveur)

    La particularité de ceci par rapport à un manager, c'est qu'à un instant donné, un message ne pouvait être accédé que par un unique thread.

    Bonne journée

  12. #12
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Je m'interroge sur la différence entre ceci et un manager.
    C'est la même chose, sauf que celui-ci est implicite et est réalisé automatiquement.

    Je rappelle que Herb Sutter et Andrei Alexandrescu ont une opinion très tranchée sur le sujet des shared_ptr
    Ils disent quoi exactement ?
    (Non pas que ce soient de si bonnes références, je pense sérieusement qu'on en dit trop à leur sujet)

    Y'a plein d'exemples d'utilisation, sinon.
    Par exemple tous les cas où tu ne veux charger une ressource nommée qu'une fois, pour éviter de recharger un truc qui est déjà chargé ailleurs dans le programme. Par exemple des polices, des sprites, des meshs, que sais-je.
    Boost ftw

  13. #13
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Centabarnak Voir le message
    Sachant que par définitions les shared_ptr sont des objets, leur utilisation rend ton programme plus lourd. Mais sur un sytème qui se respecte, ce type de contrainte, de nos jours, ne pose plus de problèmes.
    Plus lourd ?? Au contraire, c'est plus simple et plus clair !

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Peut-être voulait-il dire "en terme de performances"...
    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.

  15. #15
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pas certain qu'il y ait un véritable impact au niveau performances.

  16. #16
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Sur de tous petits objets alloues en grand nombre, ca risque de devenir visible parce que shared_ptr doit allouer et gerer la memoire pour stocker et associer les compteurs avec chaque instance (Medinoc a donne une alternative).

    Mais pour quelque chose d'aussi serieux que la gestion de la memoire, se priver des shared_ptr pour cette hypothetique raison, c'est a mon sens pas suffisant.

Discussions similaires

  1. Quel langage utiliser pour des formulaires ?
    Par le_ben dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 13/10/2005, 14h08
  2. Optimisation PHP4 lorsque l'on utilise presque des classes
    Par ouioui2000 dans le forum Langage
    Réponses: 2
    Dernier message: 11/10/2005, 17h05
  3. Utilisation optimale des procédures stockées
    Par trotters213 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/03/2005, 17h57
  4. Utilisations actuelles des principaux langages informatiques
    Par librart dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 03/07/2004, 15h37
  5. [JSP] utilisation dynamique des includes
    Par shinchun dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/05/2004, 15h28

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