LCC学习笔记之一 --内存和字符串管理

LCC学习笔记之一
--内存和字符串管理
    出于对c编译器的兴趣,近日对比GCC和LCC之后,发现LCC很小巧,而且有一本《可变目标C编译器设计与实现》可参考 ,于是最终选择LCC作为阅读对象。虽然GCC更成熟且有价值,但其源码庞大,可参考的中文资料不多,还是放在后面阅读吧。
   
    在LCC中,存储管理(包括字符串管理)、符号管理和类型管理是最基本的模块,其他的模块都会频繁用到这几部分。

    1.存储管理
    LCC的内存管理简洁且高效,特别是字符串管理,速度可谓之快若刀锋。在LCC中,内存分配与普通的内存分配不一样。LCC把根据内存的生存期分类,共分为三个分配区。每个分配区每次分配一大块内存(精确值为10k),以后的每次内存分配都从这些大块中分配,当分配区用完后,再一次性分配一大块,这样可有效地使频繁的小内存分配变得更快。而已分配的内存只需要在整个分配区生命周期结束时一次性释放即可,而不必每个小内存块去手工释放,使用起来更加灵活。分配区使用一个结构描述其使用情况:
        struct block{
            struct block *next;    //指向下一大块内存
            char *limit;    //指向空闲内存起始
            char *avail;    //指向空闲内存结尾
        };
    每次分配内存时只需要判断 avail-limit是否大于所需的长度len,如果len>avail-limit即再分配一个内存块,然后加入到next链表中。
    于此,LCC定义了三个分配区:PREM,FUNC,STMT。PERM是存放全局性符号等整个工程由始而终都需要用到的数据,FUNC和STMT则在编译单个函数时使用,当函数编译完毕后,就会即时释放。
    系统中还有一个freeblocks的变量,当释放分配区时,只需要把分配区加到freeblocks的链表头即可,下次分配新分配区时可直接从这里取,而不必调用操作系统的malloc和free,是不是很绝?
   
    2.字符串
    LCC的字符串管理非常有特色,假设LCC从源文件中得到一个字符串,它会把这个字符串复制到分配区中,然后返回其地址,LCC确保每个不同的字符串在内存中只有一个副本。以后在比较内存中的字串时,只需要比较字串指针是否相等就可以了,而不需冗长的strcmp。
    LCC包含一个静态的字串表指针数组:
    static struct string{
        char *str;    //保存字符串,内存其实是上文的分配区
        int len;    //字符串的长度,可加快字串比较
        struct string *link;    //指向下一个字符串
    }*buckets[1024];
    每个字串链表的字串都具有相同的哈希值,即这个字串表在数组中的下标。
    LCC每增加一个字符串,首先计算这个字串的哈希值,然后根据哈希值(也就是下标)决定这个字串所在的字串链表,然后在这个链表中找寻相同的字符串,如果找不到,则把字串复制到内存中,并添加到这个链表中。
    LCC现行使用的哈希桶大小为1024,实际上我们可以通过更改hash算法增加哈希桶大小,以减少字串链表长度,使字符串管理系统更高效。
zhongyh
<end>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值