⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alloc.c

📁 unix环境下实现的cmm语言编译器
💻 C
字号:
/*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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -