Tu veux les mettres où, sur la pile ? Faut arrêter, un langage avec GC ne fais pas un malloc à chaque nouvelle objet... Y a pas de nécessité à prendre plus de place sous prétexte que tu as un GC.
Imaginons maintenant que tu aies une forme, et que tu la répètes à plusieurs endroit. Avec un peu de chance, tu peux faire du partage habile, et là "juste un destructeur" ne marche plus (oui, un smart_pointeur devrait le faire)et surtout un GC se justifie-t-il dans ces conditions?
un model contient les faces, edges, vertices alors pas de ref circulaire, rien du tout, juste un destructeur qu'il faut implementer.... et c'est souvent comme ca.
Ca dépend des GC. Le GC d'Ocaml (niveau allocation je parle) va être assez différent du GC de Java par exemple.
En java du moins, ça ressemble à une allocation sur la pile, (il y a un pointeur sur le tas qui est simplement déplacé :
http://bruce-eckel.developpez.com/li...e=chap4#L4.3.4 )
Je ne répondrai à aucune question technique en privé
Mais ça reste, pour chaque objet, au moins 4 octets supplémentaires pour les informations de RTTI, et un niveau d'indirection supplémentaire.
Imaginons une classe Point avec juste deux entiers (x, y), aucune fonction virtuelle (une simple structure de stockage). Voyons ce que ça donne dans un tableau:
En C++, un pointeur --->
- objet Point de taille 8 à ptr+0
- objet Point de taille 8 à ptr+1
- objet Point de taille 8 à ptr+2
En java, un tableau d'objets, référence vers le tableau --->
- Référence de type du tableau
- tableau[0] = Référence vers objet Point --->
- objet Point de taille au moins 12
- tableau[1] = Référence vers objet Point --->
- objet Point de taille au moins 12
- tableau[2] = Référence vers objet Point --->
- objet Point de taille au moins 12
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.
Mais ceci n'est pas en soi un problème dû au garbage collector: Je suis sûr qu'en .Net on peut parvenir à des performances mémoire voisines du C++, puisqu'en .Net on a droit aux "types valeurs", qu'on peut mettre dans un tableau.
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.
el_slapper, je pense que tu as soulevé un point intéressant au sujet des formations, mais attention à 3 autres éléments :
- tous les développeurs n'ont pas une formation de développeur. Il n'est pas rare d'avoir des ingénieurs formés relativement à un métier qui se retrouvent à développer dans des équipes où pendant ce temps des développeurs de formations découvrent le métier.
- même quand on est bien formés et super douées, nous restons des humains et on a vite fait d'oublier une désallocation suite à une soirée trop arrosée, ou une nuit trop courte, ou des interruptions répétées par le client, ou ...
- les erreurs. Gérer correctement les cas non nominaux est le détail qui change toute la donne. Faire ça à la main et de façon maintenable relève de l'impossible. Même des développeurs de formation sont (généralement?) incorrectement formés à cela. D'autant que cela n'a pas du tout la même criticité selon les applications. Les GC sont une solution partielle à ce problème.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
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.
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.
je ne suis pas d'accord!
tu vois je n'ai pas de pointeurs à l'interieur de mon triangle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Triangle { private: Plane p1, p2, p3 // ou Plane boundaries[3] Plane face; Normal n; };
cela me prend donc:
1 plane = 4 doubles = 32 octets
1 normal = 3 doubles = 24 octets
donc 3*32 + 1*32 + 1*24 = 152 octets
et en Java ?
je n'ai aucun probleme, les references circulaires sont tres tres rares, et dans ce cas que tu cites j'ai no problemo, c'est un cas somme toute assez trivial, il suffirait de donner la responsabilité de destruction à un objet separé de cette fameuse liste... meme pas forcement besoin de smart-pointer
c'est pas le but d'etre objet dans un langage objet?
vouloir traiter des cas a part, c'est des problemes à gerer pour plus tard. Ces structures dans C# sont merdiques, ils auraient mieux fait d'etre consistent, d'ameliorer la gestion memoire des objets plutot que d'inventer encore un nouveau type :-/
J'avais vu dans Java 3d, la lib Vecmath leur optimisation avait consisté à mettre non pas des objets points dans les plans mais le contenu (des doubles ou float) ... c'est ce genre d'optimisation que vous voulez en Java?
A mon avis, une "déstruction" déterministe et l'utilisation d'un GC ne devrait pas être opposés. En effet, le rôle du GC est de gérer la mémoire, pas celui de gérer n'importe quelle resource partagée. Si une classe représente une resource partager, il est selon moi plus correcte d'avoir des métodes du genre "open/close" ou "connect/disconnect", plutôt de de lier ces actions uniquement à la construction et à la desctruction des objets - même si c'est sans aucun doute une bonne idée de relacher la resource partagée à la destruction de l'objet.
Le problème de java, c'est justement qu'on se retrouve à payer pour de l'objet même dans les cas où l'on n'a pas besoin d'objet.
Le C++ est excellent pour éviter de payer pour ce qu'on n'utilise pas, et les value types de .Net sont un bon compromis pour les POD, même s'ils n'ont pas toutes les fonctionnalités qu'on pourrait vouloir.
Edit: J'en profite pour rajouter cet article sur la philosophie des types valeurs en .Net : http://blogs.msdn.com/slippman/archi...13/131225.aspx
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.
de nos jours c'est quand meme tres dure d'oublier un delete.
les seules fois ou j'en fais c'est dans les destructeurs...
sinon c'est tres tres tres rare...
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Ca tombe bien que tu parles de "mauvaise conception" (en fait j'espérais que tu allais en parler).
En gros, l'idée est que si tu réalises un programme qui a pour but d'effectuer le travail A, tu souhaites que la majorité du code du programme en question soit du "A" et pas un aspect technique B, C ou D.
Je suis peut-être pas très clair...
Reprenons l'histoire de notre programme de gestion avec une base de données ou un service web derrière.
Si ton appli de gestion traite des fleurs sauvages et de leurs relations avec les ours et la pollution, tu veux que la majorité du code soit relatif aux fleurs, aux ours et à la pollution.
Inversement, tu souhaites éviter un maximum toute référence à des librairies techniques, par exemple.
Tu vas me dire que la gestion de la mémoire, ce n'est pas une librairie technique, et tu auras raison. Par contre, si dans ton code tu as à tout bout de champ des tas d'allocations mémoires (même bien foutues, hein, je parle pas d'une allocation mémoire dans une triple boucle imbriquée, par exemple), ça "pollue" ton code.
Toutes ces allocations mémoires sont du ressort de l'ordinateur, ça n'a rien à voir avec la logique qui régit les fleurs sauvages, les ours et la pollution.
Ca pollue, donc. Et par conséquent, rend ton code moins lisible, plus difficile à maintenir, etc...
Alors, maintenant, GC ou pas GC, c'est un peu une autre histoire à la limite.
Il me semble que c'est Luc qui a parlé d'avoir des smart_pointers (ou autres) aussi invisibles que possible.
D'après moi, l'idéal est de savoir comment ça marche derrière, mais de voir cette mécanique le moins possible.
On peut faire un stackalloc et un autre truc dont je me sers si peu souvent que j'ai oublié comment ça s'appelait. Ca permet d'avoir la même chose qu'un tableau initialisé sur la pile en C++. Ca nécessite de créer un type valeur particulier pour contenir le truc, par contre.
Ceci dit, tout ça c'est unsafe.
J'ai dit toutes sortes de choses. Mais la seule qui pourrait se rapprocher c'est que je concédais que les smart_pointeurs du C++ étaient un chouilla verbeux (si non aliasés par des typedef). Ou alors que gérer des ressources brutes (pas juste la mémoire) au milieu d'un code où il fallait anticiper les cas non nominaux relève de l'impossible. Et que ce que je ne veux pas voir ce sont des if(ok)-else et autres try-finally à n'en plus finir.
Maintenant, quelle est l'importance de la gestion des insectes et pesticides, et autres brebis et éleveurs dans ton modèle de fleurs et d'ours ?
OK, l'analogie est pourrie. Le truc est que les cas non nominaux relèvent aussi du métier, et vont concerner des ressources métier qu'il faut aussi gérer correctement. Et je ne veux pas plus me poser de questions au sujet de la mémoire que des autres ressources, métiers (pots de bladan et autres insecticides à refermer et ranger après utilisation) ou non (i.e. plus techniques comme des connexions DB, sockets, mémoire, etc), que je pourrais être appelé à manipuler.
Donc (comme je le disais il y a des pages et des pages de cela) les GC, pourquoi pas, mais je veux plus. Et tous les GC ne me l'offrent pas -- du moins ceux des langages qui sont en directe concurrence avec celui que j'utilise professionnellement aujourd'hui. (je fais ce que je peux pour éviter le troll langage, mais ce n'est pas facile vu que les qualités des GC varient d'un langage à l'autre, de même que les techniques plus ou moins alternatives, cf les digressions récentes)
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager