void *mm_malloc(size_t size)
{
size_t asize;
size_t extendsize;
char *bp;
if (size == 0)
return NULL;
if (size <= DSIZE)
asize = 2*DSIZE;
else
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);
if ((bp = find_fit(asize)) != NULL){
place(bp, asize);
return bp;
}
extendsize = MAX(asize, CHUNKSIZE);
if ((bp = extend_heap (extendsize/WSIZE)) == NULL)
return NULL;
place(bp, asize);
return bp;
}
asize = DSIZE * ((size + (DSIZE) + (DSIZE - 1)) / DSIZE);에서 (DSIZE - 1)을 더하는 이유는 뭘까?
8*((13+8)/8) = 16
16 bytes 할당된다면, 8의 배수는 맞지만, 21bytes는 담지못해 오버플로우가 발생한다.
asize = payload+header
8*((13+8+8)/8) = 24
8*((13+8+7)/8) = 24
13으로 했을 경우, DSIZE를 더해주는 경우와 (DSIZE - 1)을 더해주는 경우 모두 할당 블럭의 크기는 24로 같다.
8*((16+8+8)/8) = 32
8*((16+8+7)/8) = 24
필요한 크기는 24 bytes인데 DSIZE를 더해주면 너무 많은 크기를 할당해 메모리 낭비가 생긴다.
하지만, (DSIZE - 1)을 더해주면 딱 경계값에서만 올리기 때문에 메모리 낭비가 생기지 않는다.
🔑 (DSIZE - 1)을 더하는 이유는 그냥 8의 배수를 만들기 위한게 아니라, 요청한 크기를 딱 필요한 만큼만 8의 배수로 만들어주는 역할을 하기 위해서이다.