C语言解释器

C语言解释器

ID:38858159

大小:57.26 KB

页数:4页

时间:2019-06-20

C语言解释器_第1页
C语言解释器_第2页
C语言解释器_第3页
C语言解释器_第4页
资源描述:

《C语言解释器》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、1.内存池 在一些小的程序里,没什么必要添加内存管理模块在里面。但是对于比较复杂的代码,如果需要很多的内存操作,那么加入自己的内存管理是有必要的。至少有一些好处:能够加快内存的申请和释放;能够轻松的查找内存泄露问题;能够对整个软件的内存消耗做一个比较精确的统计;对以后的优化有很大的好处等等。所以,在我的解释器里,我加入了一个简单的内存管理模块,仿造了内存池的做法。 主要思想是这样的: a.记录所有的申请的内存 b.当释放内存时,记录下来以供下次申请使用 c.申请内存时,可以直接使用前面释放过的内存 为了达到以上的功能。我为申请内存的大小

2、划分粒度,例如:我得粒度这么安排{16,32,64,128,...}那么申请17个字节的大小时候,我会申请32个字节的大小。这样子方便管理。并且为每个粒度创建一个可用内存的双向链表。申请内存时,就可直接从这些链表头中申请(即将一个节点从链表头移除,作为被申请的空间,并插入到在使用的链表中),内存的释放则是一个想法的过程。这些的存储结构如下所示:   (图1.1内存池的存储结构)  typedefstruct_pool_block{   intsize;   void*data;   struct_pool_block*next;   s

3、truct_pool_block*pre;}pool_block_t;typedefstruct_pool{   intnum_all;   intnum_free;   pool_block_t*list_all;   pool_block_t*list_free[POOL_ATOM_NUM];}pool_t;intpool_atom_tab[POOL_ATOM_NUM]={   32,64,128,256,512,1024,2048,4096,8192,-1}; 说明: a.内存的申请会按照pool_atom_tab数组中的大小对齐

4、,比如申请10byte,那么,我会申请32byte. b.为每个粒度保存一个双向链表,用于保存被释放的内存。如果要申请的内存超过8192,那么我直接调用系统的malloc,释放时,直接调用free. c.内存申请过程:到相应的粒度链表(list_free)中查看是否有可用内存,如果有,直接将它从该list_free链表中移动到list_all链表。 d.内存释放过程:要释放的内存必定保存在list_all中,根据它的大小,把它移动到相应的list_free链表。 e.pool_block_t结构被放置在申请内存的前面,则在释放时,直接根

5、据Buffer指针就可得到pool_block_t的位置,从而得到next和pre,快速的在链表中移动。2.栈 栈在解释器中用到的地方很多,不管是表达式的解析,还是代码块的解析,类型的解析,等等都用到了栈。所以不实现它是不可能的事,不过在数据结构中他是最简单的了,无非就是申请一个空间,按一个一个的节点保存进去,按一个一个的节点取出来。没什么技巧在里面,只是这个我让栈的大小空间是自动增长和减小的,这么做的目的是:栈的空间仅仅限制于内存的大小。但是,这么做得缺点是,当栈的空间大小自动变化时,栈内的数据要被复制一遍,这务必会影响效率。但没有办

6、法,暂时之能这样了。唯一的办法是在时间和空间上做一个选择。 栈的存储结构如下:   (图1.2栈的存储结构)  typedefstruct_stack{   intitem_len;   intitem_num;   intstack_size;   char*p;}stack_t;   说明: item_len:  保存每个节点的长度 item_num:  栈中节点的个数 stack_size:栈中可保存的节点个数 p:         指向栈空间 a.当节点的个数item_num大于stack_size,那么必须重新申请空间,将原来

7、的数据拷贝到新的空间。 b.当节点的个数减小到一定的数量时,可以重新申请小的数据空间,释放原来大的空间。3.hash表 hash由于其快速的查找能力而著称,但是它太浪费内存了,所以用得的比较少,仅仅是在函数的调用时被使用。因为函数的调用是频繁的,如果从头查找函数,那将浪费很多的时间。这里引入hash也是必要的。  #defineHH_TAB_SIZE 128typedefstruct_hh_node{   unsignedinthash,klen,dlen;   void*key;   void*data;   struct_hh_no

8、de*next;}hh_node_t;typedefstruct_hh_head{   unsignedintnode_num;   hh_node_t* node_list;}hh_head_t;type

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。