2009-08-05 9 views
2

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?

+0

oui, ils seront combinés ensemble. – kenny

+1

@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

+1

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

Répondre

12

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).

+0

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

+0

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/ –

2

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.

+0

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 –

+0

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

+0

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

3

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.

+0

encore une question, comment une mise en œuvre a la capacité de coalescence? acclamations –

+0

@super newbie cela devrait aider http://en.wikipedia.org/wiki/Dynamic_memory_allocation – kenny

1

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.

0

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.

Questions connexes