可变目标C编译器A Retargetable C Compiler学习笔记(二)

本文探讨了C编译器中的存储管理,包括内存管理接口、分配区的表示以及空间分配策略。详细解释了allocate和deallocate函数,以及NEW和NEW1宏的使用。同时介绍了分配区的结构和空间分配的原理,并提及了union的用法以及roundup函数的作用。文章还提及了内存块的回收与管理。
摘要由CSDN通过智能技术生成

第二章 存储管理

复杂的程序一般需要动态分配内存,C语言用malloc和free来分配和释放内存,lcc也可以使用malloc和free,但是可以考虑另外一种更有效,更容易理解的方式。

2.1 内存管理接口

内存是在分配区(arena)中进行分配的。定义为
<alloc.c functions>=
extern void *allocate ARGS((unsigned long n, unsigned a));
extern void deallocate ARGS((unsigned a));

调用时:
struct T *p;
p = allocate(sizeof *p, a);

其中a是分配区,p为一个指针,使用这种方法,不论p指向什么类型的变量,都可以正确的分配空间。因为sizeof返回的一般为unsigned int 和unsigned long型,所以函数声明时用unsigned long 来定义n。

由于这种分配方式经常使用,所以我们把它定义成宏。
<alloc.c exported macros>=
#define NEW(p,a) (§ = allocate(sizeof (*p),(a));
#define NEW1(p,a) memset(NEW(p,a), 0, sizeof (*p));

宏NEW返回一个指向尚未初始化的空间的指针,NEW0将空间置为零并返回第一个参数。

数组分配方式为:
<alloc.c function>=
extern void *newarray ARGS((unsigned long m, unsigned long n, unsigned a));

2.2分配区的表示

分配区定义

struct block{
    
struct block *next;
char *limit;
char *avail;
}

next指向下一个链表中下一块,小于avail所指的区块都是已分配的区块,从avail指的地址到limit指向的地址都是待分配的内存块。

2.3空间分配

要弄清楚空间分配,必须要理解空间分配的目的。allocate函数类似于malloc函数,目的都是开辟一个大小一定的空的内存块,供变量或者结构体或者数组使用。

补充知识:
1.C语言union用法:
union中多个成员公用一个内存
例:

union align
{
   
long l;
char *p;
double d;
int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值