È possibile trovare questo codice nella K & R The C Programming Language:Linea apparentemente non necessaria nell'esempio K & R C per malloc?
void *malloc(unsigned nbytes) {
Header *p, *prevp;
Header *moreroce(unsigned);
unsigned nunits;
nunits = (nbytes+sizeof(Header)-1)/sizeof(header) + 1;
if ((prevp = freep) == NULL) { /* no free list yet */
base.s.ptr = freeptr = prevptr = &base;
base.s.size = 0;
}
for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) {
if (p->s.size >= nunits) { /* big enough */
if (p->s.size == nunits) { /* exactly */
prevp->s.ptr = p->s.ptr;
} else { /* allocate tail end */
p->s.size -= nunits;
p += p->s.size;
p->s.size = nunits; /* STRANGE LINE???????? */
}
freep = prevp;
return (void *)(p+1);
}
if (p == freep) /* wrapped around free list */
if ((p = morecore(nunits)) == NULL)
return NULL; /* none left */
}
}
C'è fondamentalmente una lista collegata, e ogni nodo della lista inizia con un colpo di testa che indica il nodo successivo e la quantità di memoria che il nodo ha allocato dopo l'intestazione (in multipli della dimensione dell'intestazione). Questa lista collegata tiene traccia di dove c'è memoria libera.
Quello che non capisco è perché la linea in "STRANGE LINE ?????" è necessario. Capisco i primi due. Vogliamo fornire all'utente la fine del nodo, quindi riduciamo le dimensioni e anticipiamo lo p
con la nuova dimensione e lo assegniamo all'utente (+1). Ma poi la terza riga vuole impostare le dimensioni del posto p
punti al numero di unità. Perché? Dopo la seconda riga p
punti in un punto nella memoria libera che non sembra avere alcun significato. È una specie di ottimizzazione ingannevole di cui non sono a conoscenza, o è effettivamente necessaria?
Grazie per qualsiasi aiuto!
Risposta perfetta, grazie. Ora vedo anche perché restituiamo 'p + 1' piuttosto che solo' p'! – bombax
perché in 'p' si hanno i metadati che descrivono il blocco assegnato ...' p' è di tipo 'Header', quindi il primo byte" user free "è a' p + 1' –