comme, souvent (pas tout le temps), tu as des tableaux qui perdurent pas rapport à d'autres (dans ce cas C par rapport à B), tu ne peux pas "récupérer" simplement les trous.
Donc, pour bénéficier au mieux des trous laissés au fur et à mesure de l'éxécution du programme, le mieux est d'avoir des "petites" allocations plutôt qu'une grosse.
Si tu as par exemple le tableau B que tu devras ré-allouer plusieurs fois car il change de taille au fur et à mesure de l'éxécution, tu auras par exemple :
Comme tu as alloué C entre-temps, il n'y a pas la place d'agrandir B là où il est situé. La routine de ré-allocation ira donc trouver le premier emplacement disponible (à la fin de C), allouera 100 emplacements, copiera les éléments des 50 anciens emplacements à l'endroit des 50 nouveaux, et laissera un trou de 50 éléments.
- 1er appel : 50 emplacements
- 2ième appel : 100 emplacements.
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|BBBBBBBBBBBBBB|CCCCCCCCTu fais ça plusieurs fois, et tu auras de gros trous dans ta mémoire totale, qui ne seront pas facilement récupérables.
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|______________|CCCCCCCC|BBBBBBBBBBBBBBBBBBBBBBB
Si maintenant tu fais une liste chaînée, chaque nouvel élément se fait par allocation. Le fait d'en détruire un crée un "petit" trou. Mais surtout, ce trou est EXACTEMENT de la taille d'un élément. Donc, à l'allocation suivante, on pourra très bien se retrouver AU MEME emplacement physique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|BBB|CCCCCCCC
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|B_B|CCCCCCCCEt même si entre-temps tu as alloué autre chose, à chaque fois ce sont de petits trous, et plus c'est découpé en tranches "élémentaires" (comme un élément d'une liste chaînée), plus il sera facile de remplir les trous, et donc de minimiser l'augmentation de la mémoire (et même de la stabiliser une fois que tu auras atteint le maximum de données possible).
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|BBB|CCCCCCCC
Maintenant, pour vraiment faire qu'un programme récupère vraiment la mémoire allouée dynamiquement, il faut une biblothèque spéciale de malloc, et surtout gérer de manière beaucoup plus complexe les pointeurs (ou bien libérer dans l'odre inverse d'allocation, ce qui très souvent n'est pas possible). Ces bibliothèques existent, mais ne marchent réllement bien que si la structure d'allocation est simple (voir mon exemple dans le post au dessus : comment faire pour avertir le programme que p2 a été modifé ???). Ou alors il faut s'assurer que ce qu'on veut libérer et ré-allouer soit le dernier élément (le C dans l'exemple).
Mais passer de :
à
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|______________|CCCCCCCC
est pratiquement impossible la plupart du temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part AAAAAAAAAAAA|CCCCCCCC
(le seul vrai moyen est de le faire soi-même, et c'est franchement pas utile dans l'écrasante majorité des cas, et en plus c'est compliqué)
Partager