OVH Cloud OVH Cloud

Allocation/désalocation de mémoire

27 réponses
Avatar
JM
Bonjour

Question de gros nullos en c++
Voila, je dois allouer puis désalouer un gros paquet d'objets en mémoire
(je sais j'en suis à la préhistoire car j'utilise new et delete)
Pour éviter de fragmenter la mémoire, est-ce qu'il est utile de
désalouer dans le sens inverse de l'allocation, ou bien est-ce que le
système gère ça suffisament bien pour ne pas se poser ce genre de question?

Merci

7 réponses

1 2 3
Avatar
Loïc Joly
Sylvain writes:


Jean-Marc Bourguet wrote on 22/06/2006 09:02:

"Arnaud Debaene" writes:


Bien sûr, çà a un coût : le GC lui-même (avec ses avantages et ses
inconvénients), l'indirection supplémentaire par rapport à des pointeurs
bruts....


Je ne vois pas ou il y a une indirection supplementaire avec les GC
compactant.


les allocations dynamiques ne retournent pas un pointeur (adresse du bloc)
mais un handle (adresse d'un pointeur contenant l'adresse du bloc). le
handle est constant pour le code utilisant, le pointeur intermédiaire peut
être changer lors du compactage mémoire.



C'est une technique d'implementation, et elle est loin d'etre
indispensable. Je ne suis meme pas sur qu'elle soit la plus courante
(ca risque de dependre du choix qu'a fait MS pour son implementation
de CLI).


A ce que j'ai lu, c'est le choix de .NET. As-tu un pointeur sur d'autres
techniques ?

--
Loïc




Avatar
Jean-Marc Bourguet
Loïc Joly writes:

Sylvain writes:

Jean-Marc Bourguet wrote on 22/06/2006 09:02:

"Arnaud Debaene" writes:


Bien sûr, çà a un coût : le GC lui-même (avec ses avantages et ses
inconvénients), l'indirection supplémentaire par rapport à des pointeurs
bruts....


Je ne vois pas ou il y a une indirection supplementaire avec les GC
compactant.


les allocations dynamiques ne retournent pas un pointeur (adresse du bloc)
mais un handle (adresse d'un pointeur contenant l'adresse du bloc). le
handle est constant pour le code utilisant, le pointeur intermédiaire peut
être changer lors du compactage mémoire.
C'est une technique d'implementation, et elle est loin d'etre

indispensable. Je ne suis meme pas sur qu'elle soit la plus courante
(ca risque de dependre du choix qu'a fait MS pour son implementation
de CLI).


A ce que j'ai lu, c'est le choix de .NET. As-tu un
pointeur sur d'autres techniques ?


J'ai pas de pointeurs spécifiques pour ça.

Un désavantage évident est la nécessité de modifier tous les
pointeurs, mais je ne suis pas sûr que ça coûte plus cher
que la double indirection qui doit tuer les caches, surtout
que copier simplement ou copier en modifiant ça ne doit pas
changer grand chose.

Une technique dont je me souvient est de faire un "mark and
sweep" classique suivit d'une phase de compaction. On peut
même combiner la phase de compaction avec la phase "mark" en
supprimant la nécessité de faire un "sweep" -- mais en
utilisant plus de mémoire.

Il y a aussi les GC "générationnels" qui utilisent deux
faits:
- la volatilité est essentiellement dans la mémoire
allouée récemment
- les nouveaux objets pointent vers les vieux, les vieux
pointent rarement vers les nouveaux (en particulier
avec les langages fonctionnels "purs", les vieux ne
pointent jamais vers les nouveaux)
pour éviter de parcourir toute la mémoire à chaque fois.

Quelques pointeurs qui pourraient être utiles:

http://www.cs.kent.ac.uk/people/staff/rej/gc.html
http://www.iecc.com/gclist/ (la FAQ mais voir aussi les archives).
http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org





Avatar
Sylvain
Jean-Marc Bourguet wrote on 22/06/2006 13:47:

C'est une technique d'implementation, et elle est loin d'etre
indispensable. Je ne suis meme pas sur qu'elle soit la plus courante


que qualifie "indispensable" ? pas la double indirection j'espère ?
sinon je vois mal un gestionnaire de mémoire déplacer d'autorité un bloc
en laissant le pointeur du client désigner une zone qui ne contient plus
ses données.

(ca risque de dependre du choix qu'a fait MS pour son implementation
de CLI).


je ne sais pas ce que cli fait, le sujet n'était pas MS.

btw, tu peux expliquer pourquoi un GC compactant le plus simple aurait
besoin de 2 fois la mémoire qu'il met à disposition ? une gestion basée
sur handle n'a que besoin d'un bloc (fixe ou dynamique) pour stocker les
handles (soit qlq Ko).

Sylvain.

Avatar
Jean-Marc Bourguet
Jean-Marc Bourguet writes:

Quelques pointeurs qui pourraient être utiles:

http://www.cs.kent.ac.uk/people/staff/rej/gc.html
http://www.iecc.com/gclist/ (la FAQ mais voir aussi les archives).
http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)


Encore une reference (je ne retombais pas dessus hier)

http://www.memorymanagement.org

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Jean-Marc Bourguet
Sylvain writes:

Jean-Marc Bourguet wrote on 22/06/2006 13:47:
C'est une technique d'implementation, et elle est loin d'etre
indispensable. Je ne suis meme pas sur qu'elle soit la plus courante


que qualifie "indispensable" ? pas la double indirection j'espère ?
sinon je vois mal un gestionnaire de mémoire déplacer d'autorité un
bloc en laissant le pointeur du client désigner une zone qui ne
contient plus ses données.


La double indirection n'est pas indispensable, il suffit de mettre a
jour les pointeurs.

Une des techniques est de marquer l'original comme deplacer en y
laissant un pointeur vers la nouvelle position.

http://www.memorymanagement.org/glossary/b.html#broken.heart

btw, tu peux expliquer pourquoi un GC compactant le plus simple aurait
besoin de 2 fois la mémoire qu'il met à disposition ?


http://www.memorymanagement.org/glossary/t.html#two-space.collector

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
adebaene

Sylvain writes:

btw, tu peux expliquer pourquoi un GC compactant le plus simple aurait
besoin de 2 fois la mémoire qu'il met à disposition ?


http://www.memorymanagement.org/glossary/t.html#two-space.collector


Cet article précise que ce n'est qu'une implémentation possible, pas
la seule (notamment en utilisant des GC générationnels...)

Arnaud


Avatar
Jean-Marc Bourguet
writes:


Sylvain writes:

btw, tu peux expliquer pourquoi un GC compactant le plus simple aurait
besoin de 2 fois la mémoire qu'il met à disposition ?


http://www.memorymanagement.org/glossary/t.html#two-space.collector


Cet article précise que ce n'est qu'une implémentation possible, pas
la seule (notamment en utilisant des GC générationnels...)


C'est pour ca que je n'ai parle que l'algo le plus simple, je n'ai pas
ecrit que c'etait la seule approche possible. Les autres que je
connais me semblent tous plus complexes.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



1 2 3