mm_c_large.c
来自「ICS 课程的Lab7」· C语言 代码 · 共 823 行 · 第 1/2 页
C
823 行
// return newptr;}void *mm_malloc(size_t size){ size_t asize; size_t extendsize; void *bp; j++; if(size<=0) { return NULL; } if(size <= DSIZE) { asize = DSIZE + OVERHEAD; }else { asize = DSIZE *((size +(OVERHEAD) + (DSIZE - 1))/DSIZE); } if(!largest_changed && (asize > largest_size)){ extendsize = MAX(asize,CHUNKSIZE); if((bp = extend_heap(extendsize/WSIZE )) == NULL) { return NULL; } return place(bp,asize); //return bp; } if((bp = find_fit(asize)) !=NULL) { if (GET_SIZE(HDRP(bp)) >= largest_size) { largest_changed = 1; } return place(bp,asize); } extendsize = MAX(asize,CHUNKSIZE); if((bp = extend_heap(extendsize/WSIZE)) == NULL) { return NULL; } return place(bp,asize); }static void *coalesce(void *bp){ size_t prev_alloc = GET_ALLOC(FTRP(PREV_BLKP(bp))); size_t next_alloc = GET_ALLOC(HDRP(NEXT_BLKP(bp))); size_t size = GET_SIZE(HDRP(bp)); void *temp1; void *temp2; if(prev_alloc && next_alloc) { if(header==NULL) { PUT(bp,(int)NULL); PUT(NEXT(bp),(int)NULL); tail=header=bp; } else { if(bp<header) { PUT(bp,(int)NULL); PUT(NEXT(bp),(int)header); PUT(header,(int)bp); header=bp; } for(temp1=header;temp1!=NULL;temp1=(void *)(GET(NEXT(temp1)))) { temp2=(void *)(GET(NEXT(temp1))); if(temp2!=NULL) { if(bp>temp1 &&bp<temp2) { PUT(NEXT(temp1),(int)(bp)); PUT(bp,(int)temp1); PUT(NEXT(bp),(int)temp2); PUT(temp2,(int)bp); return bp; } } else { if(bp>temp1) { PUT(NEXT(temp1),(int)bp); PUT(bp,(int)temp1); PUT(NEXT(bp),(int)NULL); tail=bp; } } } } if (largest_size < GET_SIZE(HDRP(bp))) { largest_size = GET_SIZE(HDRP(bp)); largest_changed = 0; largest_ptr = bp; } return bp; } else if(prev_alloc && !next_alloc) { void *nextBp=NEXT_BLKP(bp); size += GET_SIZE(HDRP(NEXT_BLKP(bp))); PUT(HDRP(bp),PACK(size,0)); PUT(FTRP(bp),PACK(size,0)); temp1=(void *)(GET(nextBp)); temp2=(void *)(GET(NEXT(nextBp))); PUT(nextBp,(int)NULL); PUT(NEXT(nextBp),(int)NULL); if(temp1==NULL && temp2==NULL) { PUT(bp,(int)NULL); PUT(NEXT(bp),(int)NULL); tail=header=bp; }else if(temp1!=NULL && temp2==NULL) { PUT(NEXT(temp1),(int)bp); PUT(bp,(int)temp1); PUT(NEXT(bp),(int)NULL); tail=bp; }else if(temp1==NULL && temp2!=NULL) { PUT(NEXT(bp),(int)temp2); PUT(temp2,(int)bp); PUT(bp,(int)NULL); header=bp; }else { PUT(NEXT(temp1),(int)bp); PUT(bp,(int)temp1); PUT(temp2,(int)bp); PUT(NEXT(bp),(int)temp2); } if (largest_size < GET_SIZE(HDRP(bp))) { largest_size = GET_SIZE(HDRP(bp)); largest_changed = 0; largest_ptr = bp; } return bp; } else if(!prev_alloc && next_alloc) { size += GET_SIZE(HDRP(PREV_BLKP(bp))); PUT(FTRP(bp),PACK(size,0)); PUT(HDRP(PREV_BLKP(bp)),PACK(size,0)); if (largest_size < GET_SIZE(HDRP(PREV_BLKP(bp))) { largest_size = GET_SIZE(HDRP(PREV_BLKP(bp))); largest_changed = 0; largest_ptr = PREV_BLKP(bp); } return PREV_BLKP(bp); }else { void *pre=PREV_BLKP(bp); void *next=NEXT_BLKP(bp); void *next1=(void *)(GET(NEXT(next))); PUT(next,(int)NULL); PUT(NEXT(next),(int)NULL); size += GET_SIZE(HDRP(PREV_BLKP(bp))) + GET_SIZE(FTRP(NEXT_BLKP(bp))); PUT(HDRP(PREV_BLKP(bp)),PACK(size,0)); PUT(FTRP(NEXT_BLKP(bp)),PACK(size,0)); if(next1==NULL) { PUT(NEXT(pre),(int)NULL); tail=pre; } else { PUT(NEXT(pre),(int)next1); PUT(next1,(int)pre); } if (largest_size < GET_SIZE(HDRP(pre))) { largest_size = GET_SIZE(HDRP(pre)); largest_changed = 0; largest_ptr = pre; } return pre; } }static void *find_fit(size_t asize){ void *bp; if(header==NULL) { return NULL; } for(bp=header;bp!=NULL;bp=(void *)(GET(NEXT(bp)))) { if(asize<=GET_SIZE(HDRP(bp))) { return bp; } } return NULL; }static void *place(void *bp,size_t asize){ size_t csize = GET_SIZE(HDRP(bp)); void *pre=(void *)(GET(bp)); void *next=(void *)(GET(NEXT(bp))); if (GET_SIZE(HDRP(bp)) >= largest_size) largest_changed = 1; if((csize - asize) >= (DSIZE + OVERHEAD)) { //if(random()%2==0) // { // PUT(bp,(int)NULL); // PUT(NEXT(bp),(int)NULL); // 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)); // if(pre==NULL && next==NULL) // { // PUT(bp,(int)NULL); // PUT(NEXT(bp),(int)NULL); // tail=header=bp; // }else if(pre!=NULL && next==NULL) // { // PUT(NEXT(pre),(int)bp); // PUT(bp,(int)pre); // PUT(NEXT(bp),(int)NULL); // tail=bp; // } // else if(pre==NULL && next!=NULL) // { // PUT(bp,(int)NULL); // PUT(NEXT(bp),(int)next); // PUT(next,(int)bp); // header=bp; // }else //{ // PUT(NEXT(pre),(int)bp); // PUT(bp,(int)pre); // PUT(NEXT(bp),(int)next); // PUT(next,(int)bp); // } // } // else // { // PUT(HDRP(bp),PACK(csize-asize,0)); // PUT(FTRP(bp),PACK(csize-asize,0)); // bp=NEXT_BLKP(bp); // PUT(HDRP(bp),PACK(asize ,1)); // PUT(FTRP(bp),PACK(asize ,1)); // } PUT(HDRP(bp),PACK(csize-asize,0)); PUT(FTRP(bp),PACK(csize-asize,0)); bp=NEXT_BLKP(bp); PUT(HDRP(bp),PACK(asize ,1)); PUT(FTRP(bp),PACK(asize ,1)); } else { PUT(HDRP(bp),PACK(csize,1)); PUT(FTRP(bp),PACK(csize,1)); if(pre==NULL && next==NULL) { tail=header=NULL; }else if(pre==NULL && next!=NULL) { PUT(next, (int)NULL); header=next; }else if(pre!=NULL && next==NULL) { PUT(NEXT(pre),(int)NULL); tail=pre; }else { PUT(NEXT(pre),(int)next); PUT(next,(int)pre); } } return bp; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?