alloc.c

来自「unix环境下实现的cmm语言编译器」· C语言 代码 · 共 76 行

C
76
字号
/*alloc.c: 对内存进行分配管理*/#include "cmm.h"#include "alloc.h"struct block {	struct block *next;	char *limit;	char *avail;};union align {	int i;	char *p;	void (*func)(void);};union header{	struct block b;	union align a;};static struct block first[] = { {NULL}, {NULL},	{NULL}},*arena[3] = {&first[0], &first[1],&first[2]};static struct block *freeblock;void *allocate(unsigned long n, unsigned a){	struct block *ap;	assert(n > 0);	assert(a >= 0 && a < NELEMS(arena));	ap = arena[a];	n = roundup(n, sizeof(union align));	while(n > ap->limit - ap->avail) {		if ( (ap->next = freeblock) != NULL) {			ap = ap->next;			freeblock = freeblock->next;			}else {			unsigned long m = n + sizeof(union header) + 10 * 1024;			ap->next = malloc(m);			if (ap->next == NULL) {				error("memory allocate fail");				exit(1);			}			ap = ap->next;			ap->limit = (char *) ap + m;		}		ap->next = NULL;			ap->avail = (char *)((union header *)ap + 1);	}	arena[a] = ap;	ap->avail += n;	return ap->avail - n;}void deallocate(unsigned a){	assert(a >= 0 && a < NELEMS(arena));	arena[a]->next = freeblock;	freeblock = first[a].next;	first[a].next = NULL;	arena[a] = &first[a];}void dispose(void){	struct block *b,*next;	for(b = freeblock; b != NULL; b = next) {		next = b->next;		free(b);	}	freeblock = NULL;}void *newarray(unsigned  m, unsigned n,  unsigned a){	return allocate( m*n, a);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?