Można znaleźć ten kod w K & R: C Programming Language:Pozornie niepotrzebna linia w przykładzie K & R C dla 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 */
}
}
Jest to w zasadzie połączonej listy, a każdy węzeł w liście zaczyna się od nagłówka wskazujący następny węzeł i ilość pamięci przydzielonej przez węzeł po nagłówku (w wielokrotnościach rozmiaru nagłówka). Ta połączona lista śledzi, gdzie jest wolna pamięć.
Co ja nie rozumiem, dlaczego linia na „dziwne LINE ?????” jest potrzebne. Rozumiem dwa pierwsze. Chcemy dać koniec węzła do użytkownika, więc zmniejszyć rozmiar i awansować p
z nowego rozmiaru i podać, że dla użytkownika (+1). Ale trzecia linia chce ustawić rozmiar miejsca na p
na liczbę jednostek. Czemu? Po drugiej linii p
wskazuje miejsce w wolnej pamięci, które nie ma żadnego znaczenia. Czy jest to jakaś sztuczna optymalizacja, której nie jestem świadomy, czy jest to rzeczywiście konieczne?
Dzięki za wszelką pomoc!
Doskonała odpowiedź, dzięki. Teraz widzę też, dlaczego zwracamy 'p + 1' zamiast tylko' p'! – bombax
bo w 'p' masz metadane opisujące przydzielony kawałek ...' 'p' jest typu Header', to pierwszy„free user”bajt jest' p + 1 ' –