La maggior parte delle implementazioni di funzioni di allocazione di memoria C memorizza le informazioni contabili per ogni blocco, sia in linea o separatamente.
Un modo tipico (inline) è quello di allocare sia un'intestazione sia la memoria richiesta, riempita con dimensioni minime. Così, per esempio, se richiesto per 20 byte, il sistema può allocare un blocco di 48 byte:
intestazione
- 16-byte contenente dimensioni, pennarello speciale, checksum, i puntatori ai successivo blocco precedente/e così via.
- 32 byte di area dati (i 20 byte sono stati riempiti con un multiplo di 16).
L'indirizzo che ti è stato dato è l'indirizzo dell'area dati. Quindi, quando si libera il blocco, free
prenderà semplicemente l'indirizzo che gli viene dato e, presumendo che non si sia riempito quell'indirizzo o la memoria circostante, controllare le informazioni contabili immediatamente prima di esso.
Tenere presente la dimensione dell'intestazione e il riempimento è totalmente definito dall'implementazione (in realtà, l'intero elemento è definito dall'implementazione a ma l'opzione di informazioni di contabilità interna è comune.
I checksum e i contrassegni speciali presenti nelle informazioni contabili sono spesso la causa di errori come "Memory arena corrotta" se si sovrascrivono. Il padding (per rendere l'allocazione più efficiente) è il motivo per cui a volte puoi scrivere un po 'oltre la fine dello spazio richiesto senza causare problemi (ancora, non farlo, è un comportamento indefinito e, solo perché funziona a volte, non lo fa t dire che va bene farlo).
un ho implementazioni di malloc
scritto in sistemi embedded dove hai preso 128 byte, non importa quello che hai chiesto (che era la dimensione della più grande struttura nel sistema) e un semplice non-inline la maschera bit è stata utilizzata per decidere se un chunk da 128 byte è stato assegnato o meno.
Altri che ho sviluppato avevano pool diversi per blocchi da 16 byte, blocchi da 64 byte, blocchi da 256 byte e blocchi da 1K, ancora usando una maschera di bit per ridurre il sovraccarico delle informazioni contabili e aumentare la velocità di malloc
e free
(senza necessità di coalescenza blocchi liberi adiacenti), particolarmente importante nel contesto stavamo lavorando.
Sede [C di programmazione:? In che modo libero sapere quanto liberare] (http://stackoverflow.com/questions/1518711/c-programming-how-does-free-know-how-much- liberare) –