CSAPP malloc实现

时间:2019-01-11 09:32:10

标签: c malloc

我最近在阅读CSAPP,并且对malloc在CSAPP中的实现有疑问。

PREV_BLKP用于通过计算当前块大小来获取先前的块指针:

#define PREV_BLKP(bp) ((char *)(bp) - GET_SIZE(((char *)(bp) - DSIZE)))

但是如何通过当前块的大小来获取先前的块指针?

如果以前的块大小和当前的块大小不同,那么我们将通过此宏得到错误的地址,对吗?

1 个答案:

答案 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));
    }
}