[問題] malloc.c中的free()解讀(?)

作者: wei115 (ㄎㄎ)   2018-10-09 16:38:41
如題
The C Programming Language的最後有一段關於簡單的malloc()&free()的實作
但其中的free()有段程式碼一直看不明白
看了許多人寫的超詳細的筆記,但無奈一直參悟不了
所以想請板上大大幫忙解讀一下m(_ _)m
http://freeport9.blog.163.com/blog/static/26050569200722104655122/
(簡體網站)
void free(void *ap)
{
Header *bp, *p;
bp = (Header *)ap - 1; /* point to block header */
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
break; /* freed block at start or end of arena */
if (bp + bp->size == p->s.ptr) { /* join to upper nbr */
bp->s.size += p->s.ptr->s.size;
bp->s.ptr = p->s.ptr->s.ptr;
} else
bp->s.ptr = p->s.ptr;
if (p + p->size == bp) { /* join to lower nbr */
p->s.size += bp->s.size;
p->s.ptr = bp->s.ptr;
} else
p->s.ptr = bp;
freep = p;
}
其中的
for (p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr)
if (p >= p->s.ptr && (bp > p || bp < p->s.ptr))
break; /* freed block at start or end of arena */
這段程式碼應該是在list中尋找適合把記憶體區塊放進去的地方
但我看不懂其中奧秘
用GDB來看也不知道為什麼要這樣比較,以及這樣比較的用意
請各位大大幫解惑,謝謝m(_ _)m
p.s. 超詳盡的筆記
https://paper.dropbox.com/doc/Lab-42-Mini-ARM-OS-LRpCaS35Pv7GNEWn0Zarq
作者: longlongint (華哥爾)   2018-10-09 23:39:00
介於兩者之間插進去特例 起點終點插入時若連續就合併

Links booklink

Contact Us: admin [ a t ] ucptt.com