2009-08-05 9 views
2

Angenommen, zwei Blöcke, die von malloc() zugewiesen wurden, die sich intern als nächste befinden (wer weiß, dass sie nebeneinander stehen? Nur Annahme), sind nach free() zwei Blöcke in einem nicht zugeordneten Block entstanden? Nicht sicher, bitte hilf mir. Vielen Dank.Wird free() defragmentiert?

+0

ja, sie werden zusammen kombiniert. – kenny

+1

@Kenny. Das ist SEHR implementierungsspezifisch, ich würde wirklich nichts davon annehmen. Hängt vom Betriebssystem ab usw. – zebrabox

+1

Kann jemand bitte ein Betriebssystem oder System geben, das nicht funktioniert? Ich bezweifle, dass einer existiert. Ja, in der Theorie ist es ein Implementierungsdetail, aber in Wirklichkeit würde Software lange ohne es laufen. – kenny

Antwort

12

Dies hängt vollständig von der Implementierung ab. Einige Zuweiser konsolidieren, manche tun, wenn bestimmte Bedingungen erfüllt sind, andere nicht. Es ist jedoch nicht etwas, das Sie in irgendeiner Weise annehmen können. Wenn dies ein Problem ist, suchen Sie nach einer Lösung, die nicht von einer solchen Annahme abhängt (z. B. selbst einen festen Pool verwalten).

+0

dlmalloc (ziemlich beliebt in einigen Kreisen) scheint es zu tun (oder zumindest die Implementierung/Version, die ich gerade vor mir googelte ..) - Ich erinnere mich, es selbst für einen Videoram-Zuweiser zu tun. Aber gut, Fazit ist, das ist keine Annahme, die der Client-Code machen soll :) – nielsj

+0

Sie könnten auch interessiert sein an nedmalloc, die sich als ein kleiner Fragmentierung Speichermanager wirbt - es basiert auf dlmalloc, http: // www .nedprod.com/programs/portable/nedmalloc/ –

2

Dies ist (sehr) implementierungsabhängig. Aber wenn du etwas dagegen tun willst, ist es nicht kostenlos() solltest du aber malloc() anschauen. Versuchen Sie, nicht viele kleine Blöcke zuzuweisen.

+0

Gute Kommentare, leider fragt meine App häufiger kleinere Blöcke und das macht mich besorgt, dass der Haufen fragmentiert wird. Ist es also möglich zu wissen, ob meine Plattform konsolidiert? danke –

+0

Ich stimme der Implementierung zu, aber viele Heap-Allokatoren verwenden mehrere Strategien, d. h. klein, mittel und groß und haben oft einen dedizierten kleinen Objekt-Heap. Zum Beispiel XP hat eine 'Low Fragmentation Heap' Strategie http://msdn.microsoft.com/en-us/library/aa366750(VS.85).aspx – zebrabox

+0

Das ist ein guter - alternativ können Sie wählen, um diese kleineren Stücke zu verwalten von Speicher selbst, wenn das dem Kontext/Umfang entspricht. – nielsj

3

Das hängt vollständig von der Implementierung des Zuweisers ab. Es gibt many different Implementierungen, some of which Koaleszenz von angrenzenden freien Speicher durchführen.

Bearbeiten: Hier ist eine research paper, die verschiedene Zuordnungstechniken und Benchmarks ihre Auswirkungen auf die Fragmentierung beschreibt. Ich denke, ihre Schlussfolgerung ist, dass die Adressen-geordneten Frei-Block-Listen (die für einfaches Zusammenfügen sorgen) sehr gut funktionieren.

+0

erneut in Frage gestellt, wie eine Implementierung die Fähigkeit hat, zu verschmelzen? Prost –

+0

@super Neuling sollte dies helfen http://en.wikipedia.org/wiki/Dynamic_memory_allocation – kenny

1

Ich glaube nicht, dass es Algorithmen gibt, die häufig verwendet werden, die nie benachbarten Speicher zusammenführen. Aber es gibt Algorithmen, die es nicht tun, sobald zwei freie Blöcke benachbart sind, aber einige zusätzliche Bedingungen benötigen. Zwei Beispiele:

  • Verteilern verschiedene Speicherbereiche mit auf der gefragt je nach Größe (zum Beispiel der für kleine Blöcke Größe Zweckdatenstruktur verwenden, so dass sie weniger Overhead) wird oft nicht für einige Größen benachbarte Blöcke zusammenwachsen, auch wenn sie verwenden einen allgemeineren Algorithmus für andere Größen;

  • Buddy Speicherzuweiser werden zwei Blöcke nur kombinieren, wenn sie Buddy sind.

0

Keine Garantien, aber viele Zuweiser tun. Wenn Sie ein Performance-Problem mit Speicher haben, erhalten Sie Antworten mehr auf den Punkt, wenn Sie diese Frage direkt stellen. Es gibt viele, viele Techniken zum Verbessern der Speicherleistung von C-Code; es ist ein häufiger Engpass.