C++ et GC ?

C++ et GC ? - C++ - Programmation

Marsh Posté le 01-05-2005 à 02:51:18    

Bonjour,
 
que pensez-vous de l'utilisation d'un garbage collector en C++ ?
j'ai lu un peu de doc sur celui ci : http://www.hpl.hp.com/personal/Hans_Boehm/gc/
apparement, il serait assez compliqué de le faire interagir avec la stl par exemple ...
 
pour vous, est-ce uniquement une solution de facilité, ou cela peut-il avoir aussi des avantages comme l'ecriture de code plus robuste avec moins de prises de tete ?
on peut peut-être aussi le comparer à l'utilisation de shared_ptr et consors de boost ?
 
Merci pour vos réponses :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 01-05-2005 à 02:51:18   

Reply

Marsh Posté le 01-05-2005 à 15:28:07    

blackgoddess a écrit :

Bonjour,
 
que pensez-vous de l'utilisation d'un garbage collector en C++ ?
j'ai lu un peu de doc sur celui ci : http://www.hpl.hp.com/personal/Hans_Boehm/gc/
apparement, il serait assez compliqué de le faire interagir avec la stl par exemple ...


 
L'interface proposé n'est guère convaincante ...
 

Citation :

pour vous, est-ce uniquement une solution de facilité, ou cela peut-il avoir aussi des avantages comme l'ecriture de code plus robuste avec moins de prises de tete ?
on peut peut-être aussi le comparer à l'utilisation de shared_ptr et consors de boost ?


 
Je ne pense pas que ce soit une solution de facilité, on peut arriver à écrire du code ou on se noie complètement dans la gestion de la mémoire, et ça peut etre bien pratique.
boost::shared_ptr est une solution, mais elle ne tient pas compte des références cycliques qui peuvent intervenir. Heureusement, boost::weak_ptr arrive à la rescousse.
 
Exemple :
 

Code :
  1. #include <boost/shared_ptr.hpp>
  2. #include <boost/weak_ptr.hpp>
  3. #include <iostream>
  4. namespace {
  5.     struct Foo
  6.     {
  7.     Foo() {std::cout << "Constructeur de Foo\n";}
  8.     ~Foo() {std::cout << "Destructeur de Foo\n";}
  9.     void next(const boost::shared_ptr<Foo>&  p) { ptr = p; }
  10.     private:
  11.     boost::weak_ptr<Foo> ptr;
  12.     // boost::shared_ptr<Foo> ptr; // ne liberera pas correctement la mémoire
  13.     };
  14. }
  15. int main()
  16. {
  17.     boost::shared_ptr<Foo> p1(new Foo());
  18.     boost::shared_ptr<Foo> p2(new Foo());
  19.     p1->next(p2);
  20.     p2->next(p1); // référence cyclique
  21. }


 
L'avantage de cette solution par rapport au GC, c'est qu'on peut savoir quand est appelé le destructeur.
 
peut etre que d'autres peuvent parler de __gc que je ne connais guère et qui à l'air bien merdique.
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 01-05-2005 à 15:51:09    

[:pcgamer]  
 
moi je manque un peu de recul, qu'est-ce que pourrait apporter un gc par rapport à une utilisation de boost::shared_ptr/boost::weak_ptr ? à première vue je vois plustôt des inconvénients mais je manque peut-être l'essentiel ?

Reply

Marsh Posté le 01-05-2005 à 15:57:28    

ça demande de ne pas se vautrer dans la distribution des roles boost::shared_ptr et boost::weak_ptr ...

Reply

Marsh Posté le 01-05-2005 à 17:38:18    

sigmatador a écrit :

p-e pas si merdique au vu des projets qui l'utilise (meme si je ne suis pas fan du concept de garbage collector)


 
Tiens, j'ai vu que Mozilla l'utilisait. Bizarre, le 1.7.5 me bouffe toute ma mémoire en 4-5 jours :(

Reply

Marsh Posté le 01-05-2005 à 18:18:05    

mozilla c'est de la merde. ça leak, ça fragmente, ça leak serveur X, ça pue.
 
Pour le GC, c'est cool, sauf qu'il sens mauvais le C ou le Java, bref il appelle pas forcément ton destructeur ...

Reply

Marsh Posté le 01-05-2005 à 18:44:07    

Taz a écrit :

mozilla c'est de la merde. ça leak, ça fragmente, ça leak serveur X, ça pue.


 [:dimebag darrell]

Reply

Marsh Posté le 01-05-2005 à 21:36:17    

Y'a pas que la gestion auto de la durée de vie des objets dans un GC. Ce que j'aimerai bien tester, c'est la différence du coût de l'allocation des objets au fil de l'exécution. Je pense que l'allocation d'un GC doit être plus performante, grâce à moins de fragmentation. Il faut se gérer des pool en C++ pour arriver à quelque chose d'équivalent je suppose. Moi j'aimerai bien des smart ptr qui en interne gèrent un pool spécifique à chaque type d'objet alloué.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 01-05-2005 à 21:36:58    

euh le boehm, je sais pas s'il compacte alors ...

Reply

Marsh Posté le 02-05-2005 à 00:03:24    

de toute façon, les GC performants ne sauront jamais appeler les destructeurs correctement :D
 
Sinon, bohem à un très bon usage qui ne pourri pas les perfs : c'est un detecteur de memory leak a utiliser dans du code de debug. Je crois que c'est comme ça que mozilla l'utilise

Reply

Marsh Posté le 02-05-2005 à 00:03:24   

Reply

Marsh Posté le 02-05-2005 à 00:05:08    

exacte.

Reply

Marsh Posté le 02-05-2005 à 00:07:05    

Si tu veux du C objet avec un GC, il faut faire de l'Objective C.

Reply

Marsh Posté le 02-05-2005 à 14:18:25    

Pour __gc c'est managed C++, .Net quoi. C'est comme ça que tu déclares (déclarais) ta classe / variable comme étant un type managé. En lui même c'est pas merdique, c'est réellement garbage collecté. Ce qui est merdique c'est la syntaxe qui est lourde, plus l'ambiguite à savoir si un objet est managé ou non (les 2 utilisent new, faut aller lire le .h pour trouver ou non le __gc et être fixé).
Dans C++ CLI ils ont revu ça, en distinguant les objets natifs (new) des managés (gcnew).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 02-05-2005 à 14:45:44    

Taz a écrit :

euh le boehm, je sais pas s'il compacte alors ...


les GCs conservatifs ne compactent *jamais*, c'est exactement pour ça qu'on les dit conservatifs.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 02-05-2005 à 15:09:10    

voui, me suis mal exprimé. Je voulais être ironiqe :tacle à la gorge:

Reply

Marsh Posté le 03-05-2005 à 11:30:12    

Vous auriez d'autres GC en tête utilisables en C++ ? pour pouvoir les comparer entre eux :)
 
Merci :)


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed