【发布时间】:2014-07-12 01:00:03
【问题描述】:
您可以在 K&R 的 The C Programming Language 中找到这段代码:
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 */
}
}
基本上有一个链表,链表中的每个节点都以一个标头开头,该标头指示下一个节点以及该节点在标头之后分配的内存量(以标头大小的倍数)。此链表跟踪有空闲内存的位置。
我不明白为什么“奇怪的线??????”是需要的。我理解前两个。我们想将节点的末端提供给用户,因此我们缩小尺寸,并使用新尺寸推进p 并将其提供给用户(+1)。但是第三行想要将p指向的位置的大小设置为单元数。为什么?在第二行之后p 指向空闲内存中似乎没有任何意义的位置。这是我不知道的某种棘手的优化,还是真的有必要?
感谢您的帮助!
【问题讨论】: