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 :

Garbage Collector : génération de l'arbre des objets atteignables


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut Garbage Collector : génération de l'arbre des objets atteignables
    Bonjour,

    Je dois implanter un garbage collector en C++. J'ai pu lire de la documentation sur les différents algorithmes qui existent. Je pense me pencher sur la méthode de l'algorithme copiant.

    Mon problème concerne la génération de l'arbre des objets. Je n'arrive pas à voir comment à partir d'un objet, ne connaissant pas sa structure, je peux savoir qu'il possède un pointeur sur un autre objet.

    Auriez-vous une idée ?

    Merci d'avance de bien vouloir me proposer votre avis et/ou vos idées sur la question.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Tu peux faire de toutes les références des classes (typiquement template) qui, lors de leur création, doivent "s'enregistrer" auprès du GC. Ensuite, pour détecter les cycles, tu peux rendre obligatoire le fait qu'elles enregistrent aussi l'objet qui les contient...

    Sachant que dans un système comme Java, les objets ne peuvent être que sur le tas.
    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
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    euuh c'est très pointu ce que tu demandes là..
    tu serais le concepteur du compilateur tu pourrais le faire mais un Garbage Collector générique cela me parait ardu sans pouvoir toucher au compilateur...
    Pour la bonne et unique raison que le compilateur connait les types ,taille et adresse mémoire de chaque objet; en C++ c'est pas comme en Java les types doivent être connus à la compilation..
    Citation Envoyé par Foogiz972 Voir le message
    Mon problème concerne la génération de l'arbre des objets. Je n'arrive pas à voir comment à partir d'un objet, ne connaissant pas sa structure, je peux savoir qu'il possède un pointeur sur un autre objet.
    Et moi non plus et je ne vois vraiment pas non plus...
    si tu déclares int *p, le pointeur p est en fait une adresse mémoire sur 32 bits pour un compilateur 32 bits..
    Donc comment sait-on que c'est un pointeur en runtime? Le compilateur le sait à la compilation...

  4. #4
    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 : 50
    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
    Je n'ai pas bien compris : Tu dois faire un GC en C++, certes, mais il doit gérer des objets à toi dans un langage à toi, ou il doit gérer les objets C++ de ton application ?

    Dans le second cas, tu n'as pas trop le choix... Soit tu t'inscrit dans une phase de compilation pour obtenir plus d'info sur la structure des objets, soit tu fait l'hypothèse que tout ce que contiennent tes objets sont potentiellement des pointeurs, et doit donc être protégé. C'est ce que fait le GC de Boehms je crois.

    A noter que ça ne protège pas des petits malins qui manipulent les pointeurs étrangement (le coup du xor pour des listes doublement chaînées, par exemple).
    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.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je n'ai pas bien compris : Tu dois faire un GC en C++, certes, mais il doit gérer des objets à toi dans un langage à toi, ou il doit gérer les objets C++ de ton application ?
    non je crois qu'il veut faire un GC générique

  6. #6
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut
    Merci beaucoup pour la rapidité de vos réponse.

    Donc je précise ma problématique :

    Je dois faire un GC générique. Pour ce faire, je crée un singleton GC qui va stocker tous les pointeurs qui seront instanciés au cours de l'exécution du programme. Par surcharge de l'opérateur new, je mets à jour mon GC, et ainsi je peux avoir accès à tous les objets qui auront été initialisés.

    Selon les documents que j'ai pu lire, il aurait fallut que je sois capable de construire un arbre qui me permettra de savoir quels sont les objets qui sont atteignables. Après comparaison avec les pointeurs de mon GC, je serai capable alors de déterminer les objets qui sont à détruire.

    Citation Envoyé par Médinoc Voir le message
    Ensuite, pour détecter les cycles, tu peux rendre obligatoire le fait qu'elles enregistrent aussi l'objet qui les contient...
    Cette idée me paraît être une solution à creuser mais si je pouvais éviter de contraindre l'utilisateur de mon GC, ça me plairait un peu plus.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Sinon, tu peux créer une "définition de classe" logicielle qui indique pour chaque classe d'objet, les offsets (pointeur vers membres) de ses champs contenant des pointeurs...
    Ensuite, utiliser un peu de RTTI pour faire correspondre un pointeur d'objet à une "définition de classe". Ce qui sera encore plus facile si tous les objets du GC doivent hériter d'une classe commune...
    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.

  8. #8
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sinon, tu peux créer une "définition de classe" logicielle qui indique pour chaque classe d'objet, les offsets (pointeur vers membres) de ses champs contenant des pointeurs...
    Ensuite, utiliser un peu de RTTI pour faire correspondre un pointeur d'objet à une "définition de classe". Ce qui sera encore plus facile si tous les objets du GC doivent hériter d'une classe commune...
    Si j'ai bien compris tu me proposes une solution qui me permettrait de connaitre tous les membres des classes d'objet, et avec le RTTI, je pourrais savoir s'il s'agit d'un pointeur ou pas et ainsi voir les dépendence entre mes objets ?

    Dans ce cas pourrais-tu me donner des pistes sur la façon de procéder. Je ne vois pas ce que tu appelles "définition de classe".

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Je parle de construire en mémoire un truc qui dit "Telle classe GC contient une référence GC à tel offset".
    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.

  10. #10
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 16
    Par défaut
    Je suis vraiment désolé mais je n'arrive pas à comprendre ce que tu veux me dire.

    En fait, je n'aurai dans le programme qui va utiliser mon garbage collector qu'un seul et unique objet GC qui va organiser tous les pointeurs du programme.

    Ceci dit, je pense avoir trouvé une solution à priori plus simple et qui ne vas pas chercher à faire des dépendances entre le objets. J'y travaille et je vous tiens au courant si mes résultats sont prometteurs.

    Merci encore pour vos réponse. Je reste tout de même à l'écoute de toutes propositions

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 29/06/2009, 07h20
  2. Garbage Collector/libération objets référencés
    Par LeSmurf dans le forum Général Java
    Réponses: 3
    Dernier message: 17/12/2006, 19h47
  3. Réponses: 3
    Dernier message: 17/10/2005, 16h26
  4. [JVM] les objets et le Garbage collector
    Par Kurdran dans le forum Général Java
    Réponses: 7
    Dernier message: 02/06/2005, 16h57

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