realloc(拆分?)中的最佳内存利用率

时间:2013-03-03 02:37:23

标签: c memory dynamic realloc allocator

我在编写realloc函数时遇到了困难。

我让它通过标准的memcpy程序工作,但我无法对其进行优化。我知道我需要适应另外两种情况:向前扩展当前块,并检查当前大小的块是否足够大(如果太大,则将其拆分为空闲内存)。

然而,我似乎无法做对。我总是得到错误。为了澄清,这些不是编译错误......这些是通过跟踪驱动程序失败的堆完整性检查。如果我这样做而没有分裂,我会耗尽内存,如果我尝试拆分,它会说“无法保留原始块/数据。”

以下是我的常规memcpy代码。中间的评论部分是我尝试扩展,但我认为我需要分裂,因为它导致了大量的碎片。这导致我在(一次)realloc测试期间内存不足和错误输出。如果我没有评论块,它可以正常工作,但没有优化。

我的分裂尝试总是失败;底部评论的代码是我的尝试。我在这里做错了什么?

我非常感谢任何帮助,谢谢。 :)

#define PACK(size, alloc) ((size) | (alloc))
#define GET_SIZE(p) (GET(p) & ~0x7)
#define GET_ALLOC(p) (GET(p) & 0x1)
#define HDRP(bp) ((char *)(bp) - WSIZE)
#define FTRP(bp) ((char *)(bp) + GET_SIZE(HDRP(bp)) - DSIZE)
#define NEXT_BLKP(bp) ((char *)(bp) + GET_SIZE(((char *)(bp) - WSIZE)))

void *mm_realloc(void *oldptr, size_t size)
{
    void *newptr;
    size_t copySize;
    copySize = GET_SIZE(HDRP(oldptr));
    size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(oldptr)));
//  if (copySize > size) return oldptr;

    /*if (!next_alloc) { 
        if ((GET_SIZE(HDRP(oldptr)) + GET_SIZE(HDRP(NEXT_BLKP(oldptr))))>size) {
        copySize += GET_SIZE(HDRP(NEXT_BLKP(oldptr)));
        PUT(HDRP(oldptr), PACK(copySize,1));
        PUT(FTRP(oldptr), PACK(copySize,1));
        return oldptr;
        }
    }*/

    newptr = mm_malloc(size);
    if (newptr == NULL)
      return NULL;
    if (size < copySize)
        copySize = size;
    memcpy(newptr, oldptr, copySize);
    PUT(newptr,GET(oldptr));
    mm_free(oldptr);
    return newptr;
}

//      int total_avail = (GET_SIZE(HDRP(oldptr)) + GET_SIZE(HDRP(NEXT_BLKP(oldptr))));
//      copySize -= (total_avail - size);

0 个答案:

没有答案