En supposant deux blocs alloués par malloc() qui sont internes l'un à côté de l'autre (qui sait qu'ils se succèdent?), Après free() deux blocs, sont-ils sortis dans un bloc non alloué? Pas sûr, s'il vous plaît aider. Merci.Est-ce que free() défragmente?
Répondre
Ceci dépend entièrement de l'implémentation. Certains allocateurs consolident, d'autres le font si certaines conditions sont remplies, d'autres non. Ce n'est pas quelque chose que vous pouvez assumer de quelque façon que ce soit. S'il s'agit d'un problème, recherchez une solution qui ne dépende pas d'une telle hypothèse (par exemple, gérez vous-même un pool fixe).
dlmalloc (très populaire dans certains cercles) semble le faire (ou du moins la mise en œuvre/version que j'ai juste googlé devant moi ..) - Je me souviens d'avoir fait ça moi-même pour un allocateur de vidéoram. Mais bon, la ligne de fond est, ce n'est pas une supposition que le code client devrait vouloir faire :) – nielsj
vous pourriez également être intéressé par nedmalloc qui se présente comme un petit gestionnaire de mémoire de fragmentation - il est basé sur dlmalloc, http: // www .nedprod.com/programs/portable/nedmalloc/ –
Cela dépend (très) de l'implémentation. Mais si vous voulez faire quelque chose, ce n'est pas gratuit() vous devriez regarder mais malloc(). Essayez de ne pas allouer beaucoup de petits blocs.
Bons commentaires, malheureusement mon application ne demande pas de plus petits morceaux de blocs fréquemment et cela m'inquiète que le tas soit fragmenté. Est-il possible de savoir si ma plateforme se «consolide»? merci –
Je suis d'accord sur la mise en œuvre mais de nombreux allocateurs tas utilisent des stratégies multiples, c'est-à-dire petites, moyennes et grandes et ont souvent un petit tas d'objets dédiés. Par exemple, XP a une stratégie 'Low Fragmentation Heap' http://msdn.microsoft.com/en-us/library/aa366750(VS.85).aspx – zebrabox
C'est un bon - alternativement, vous pouvez choisir de gérer ces petites pièces de la mémoire vous-même, si cela convient au contexte/portée. – nielsj
Cela dépend entièrement de la mise en œuvre de l'allocateur. Il y a many different implmentations, some of which effectuer la coalescence de la mémoire libre adjacente.
Édition: Voici un research paper qui décrit diverses techniques d'allocation et compare leur effet sur la fragmentation. Je pense que leur conclusion est que les listes de blocage libres commandées par adresse (qui facilitent la coalescence) fonctionnent très bien.
encore une question, comment une mise en œuvre a la capacité de coalescence? acclamations –
@super newbie cela devrait aider http://en.wikipedia.org/wiki/Dynamic_memory_allocation – kenny
Je ne pense pas qu'il y ait des algorithmes couramment utilisés qui ne coalescent jamais la mémoire adjacente. Mais il y a des algorithmes qui ne le font pas dès que deux blocs libres sont adjacents mais ont besoin de conditions supplémentaires. Deux exemples:
allocataires en utilisant les différentes régions de mémoire en fonction de la taille demandé (par exemple qui utilisent structure de données à usage spécial pour la petite taille des blocs afin qu'ils aient moins de frais généraux) fusionneront souvent des blocs adjacents pour certaines tailles, même si ils utilisent un algorithme plus général pour d'autres tailles;
Les allocateurs de mémoire buddy combinent deux blocs uniquement s'ils sont associés.
Aucune garantie, mais beaucoup d'allocateurs. Si vous avez un problème de performance impliquant la mémoire, vous obtiendrez des réponses plus au point si vous poser cette question directement. Il existe de nombreuses techniques pour améliorer les performances de la mémoire du code C; C'est un goulot d'étranglement fréquent.
- 1. Gardez UI Thread free
- 2. Sortir sur stderr dès que malloc/free est appelé
- 3. Générateur Free/OpenSource .NET Diff?
- 4. Free 3 0f 9 Extended Barcode polices
- 5. Librairie graphique GUI pour Schedule/Free .NET
- 6. Free/OpenSource Java Rules/Workflow moteur
- 7. COM-Free COM dans une application ASP.Net
- 8. Où est-ce que malloc()/free() stocke les tailles et les adresses allouées?
- 9. projet de proxy basé sur open source/free web
- 10. Comment forcer l'abandon sur "glibc detected *** free(): pointeur invalide"
- 11. Apportez FMIT (Free Music INstrument Tuner) dans Eclipse en tant que projet, construire et exécuter dans Ubuntu
- 12. Quelle est la meilleure bibliothèque de conversion d'images Free/Open-Source dans .NET?
- 13. Problèmes de moulage en essayant d'être générique/'type free' | ASP MVC
- 14. Base de données de stockage de données XML? free et opensource
- 15. Free ou open source. Base de données .Net afficher/modifier des outils comme phpMyAdmin
- 16. Quel est le meilleur moyen de valider XML w.r.t XSD en utilisant Free XML Validator?
- 17. Statistiques du référentiel Subversion, autres que StatSVN?
- 18. Est-ce que fullamdata __gc metamethod doit libérer() sa mémoire?
- 19. Un diagramme de classes est à un programme en tant que ________ est à une base de données?
- 20. Que signifie "==="?
- 21. Que signifie = *?
- 22. Que signifie %%?
- 23. Aucune fuite de mémoire lors de la définition du formulaire en tant que parent de l'image?
- 24. Est-ce que SqlDataReader stocke tout en tant que chaîne?
- 25. Que peut faire ce que sed ne peut pas faire?
- 26. Que signifie i_tmp2 lorsqu'il est utilisé en tant que variable?
- 27. .NET en tant que client, Java en tant que serveur
- 28. Je suppose que SqlParameter.IsNullable n'a de sens que lorsque ...?
- 29. qu'est-ce que NMAKE?
- 30. Que fait cette fonction?
oui, ils seront combinés ensemble. – kenny
@Kenny. C'est très spécifique à l'implémentation, je ne supposerais vraiment rien. Cela dépend du système d'exploitation, etc. – zebrabox
Quelqu'un peut-il donner un système d'exploitation ou un système qui ne fonctionne pas? Je doute qu'un existe. Oui, en théorie, c'est un détail de mise en œuvre, mais en réalité le logiciel fonctionnerait longtemps sans cela. – kenny