gpt4 book ai didi

CSAPP malloc 实现

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:29 27 4
gpt4 key购买 nike

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

PREV_BLKP 用于通过计算当前 block 大小来获取前一个 block 指针:

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

但是我们如何通过当前 block 大小获取前一个 block 指针呢?

如果之前的 block 大小和当前的 block 大小不一样,那么我们会通过这个宏得到错误的地址吗?

最佳答案

我假设您指的是 this code ,分配 block 的大小通过以下方式打包到 block 地址中:

/* Pack a size and allocated bit into a word */
#define PACK(size, alloc) ((size) | (alloc)) //line:vm:mm:pack

打包后的地址通过PUT宏存储在place函数中,因此它可以处理不同大小的 block 而不会覆盖任何东西。

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

关于CSAPP malloc 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54143706/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com