Оптимальное использование памяти в realloc (расщепление?)
У меня проблемы с кодированием моей функции 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);