我最近在阅读CSAPP,并且对malloc
在CSAPP中的实现有疑问。
宏PREV_BLKP
用于通过计算当前块大小来获取先前的块指针:
#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))
但是如何通过当前块的大小来获取先前的块指针?
如果以前的块大小和当前的块大小不同,那么我们将通过此宏得到错误的地址,对吗?
答案 0 :(得分:1)
我假设您是指this code,所分配块的大小通过以下方式打包到块地址中:
/* Pack a size and allocated bit into a word */
#define PACK(size, alloc) ((size) | (alloc)) //line:vm:mm:pack
并且打包的地址通过place
宏存储在PUT
函数中,因此它可以处理不同大小的块,而不会覆盖任何内容。
static void place(void *bp, size_t asize)
/* $end mmplace-proto */
{
size_t csize = GET_SIZE(HDRP(bp));
if ((csize - asize) >= (2*DSIZE)) {
PUT(HDRP(bp), PACK(asize, 1));
PUT(FTRP(bp), PACK(asize, 1));
bp = NEXT_BLKP(bp);
PUT(HDRP(bp), PACK(csize-asize, 0));
PUT(FTRP(bp), PACK(csize-asize, 0));
}
else {
PUT(HDRP(bp), PACK(csize, 1));
PUT(FTRP(bp), PACK(csize, 1));
}
}