Die meisten Implementierungen von C-Speicherzuweisungsfunktionen speichern Abrechnungsinformationen für jeden Block entweder inline oder separat.
Ein typischer Weg (inline) besteht darin, sowohl einen Header als auch den von Ihnen angeforderten Speicher zuzuweisen, der auf eine Mindestgröße aufgefüllt ist. Wenn Sie beispielsweise nach 20 Bytes gefragt haben, weist das System möglicherweise einen 48-Byte-Block zu:
- 16-Byte-Header mit Größe, Spezialmarkierung, Prüfsumme, Zeigern auf den nächsten / vorherigen Block usw.
- 32-Byte-Datenbereich (Ihre 20 Byte werden auf ein Vielfaches von 16 aufgefüllt).
Die Ihnen dann gegebene Adresse ist die Adresse des Datenbereichs. Wenn Sie den Block free
freigeben, nehmen Sie einfach die Adresse, die Sie ihm gegeben haben, und überprüfen Sie die Buchhaltungsinformationen unmittelbar davor, vorausgesetzt, Sie haben diese Adresse oder den Speicher um ihn herum nicht vollgestopft. Grafisch wäre das wie folgt:
____ The allocated block ____
/ \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
^
|
+-- The address you are given
Beachten Sie, dass die Größe des Headers und des Auffüllens vollständig implementierungsdefiniert sind (tatsächlich ist das Ganze implementierungsdefiniert (a) aber die Inline-Abrechnungsoption ist eine übliche).
Die Prüfsummen und speziellen Markierungen in den Buchhaltungsinformationen sind häufig die Ursache für Fehler wie "Speicherbereich beschädigt" oder "Doppelt frei", wenn Sie sie überschreiben oder zweimal freigeben.
Das Auffüllen (um die Zuordnung effizienter zu gestalten) ist der Grund, warum Sie manchmal ein wenig über das Ende Ihres angeforderten Speicherplatzes hinaus schreiben können, ohne Probleme zu verursachen (tun Sie das trotzdem nicht, es ist undefiniertes Verhalten und, nur weil es manchmal funktioniert, nicht) Ich meine, es ist okay, es zu tun.
(a) Ich habe Implementierungen von geschriebenmalloc
in eingebetteten Systemen bei denen Sie 128 Bytes erhalten haben, unabhängig davon, wonach Sie gefragt haben (das war die Größe der größten Struktur im System), vorausgesetzt, Sie haben nach 128 Bytes oder weniger gefragt (Anfragen nach mehr würden mit einem NULL-Rückgabewert erfüllt sein). Eine sehr einfache Bitmaske (dh nicht inline) wurde verwendet, um zu entscheiden, ob ein 128-Byte-Block zugewiesen wurde oder nicht.
Andere, die ich entwickelt habe, hatten unterschiedliche Pools für 16-Byte-Chunks, 64-Byte-Chunks, 256-Byte-Chunks und 1K-Chunks, wobei wiederum eine Bitmaske verwendet wurde, um zu entscheiden, welche Blöcke verwendet wurden oder verfügbar waren.
Beiden Optionen verwalten den Aufwand der Accounting - Informationen zu reduzieren und die Geschwindigkeit zu erhöhen malloc
und free
(keine Notwendigkeit zu benachbarten Blöcke zusammenwachsen , wenn Befreiung), besonders wichtig in der Umgebung , die wir in arbeiten.