日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言解释器的实现--存储结构(一)

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言解释器的实现--存储结构(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

?????1. 內存池

?????2. 棧

?????3. Hash表

1.內存池
? 在一些小的程序里,沒什么必要添加內存管理模塊在里面。但是對于比較復雜的代碼,如果需要很多的內存操作,那么加入自己的內存管理是有必要的。至少有一些好處:能夠加快內存的申請和釋放;能夠輕松的查找內存泄露問題;能夠對整個軟件的內存消耗做一個比較精確的統計;對以后的優化有很大的好處等等。所以,在我的解釋器里,我加入了一個簡單的內存管理模塊,仿造了內存池的做法。
? 主要思想是這樣的:
? a.記錄所有的申請的內存
? b.當釋放內存時,記錄下來以供下次申請使用
? c.申請內存時,可以直接使用前面釋放過的內存
? 為了達到以上的功能。我為申請內存的大小劃分粒度,例如:我得粒度這么安排{16,32,64,128,...}那么申請17個字節的大小時候,我會申請32個字節的大小。這樣子方便管理。并且為每個粒度創建一個可用內存的雙向鏈表。申請內存時,就可直接從這些鏈表頭中申請(即將一個節點從鏈表頭移除,作為被申請的空間,并插入到在使用的鏈表中),內存的釋放則是一個想法的過程。這些的存儲結構如下所示:
??
? (圖1.1 內存池的存儲結構)
??
typedef struct _pool_block{
??? int size;
??? void * data;
??? struct _pool_block * next;
??? struct _pool_block * pre;
}pool_block_t;

typedef struct _pool{
??? int num_all;
??? int num_free;
??? pool_block_t * list_all;
??? pool_block_t * list_free[POOL_ATOM_NUM];
}pool_t;

int pool_atom_tab[POOL_ATOM_NUM] = {
??? 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, -1
};

? 說明:
? a.內存的申請會按照pool_atom_tab數組中的大小對齊,比如申請10byte,那么,我會申請32byte.
? b.為每個粒度保存一個雙向鏈表,用于保存被釋放的內存。如果要申請的內存超過8192,那么我直接調用系統的malloc,釋放時,直接調用free.
? c.內存申請過程:到相應的粒度鏈表(list_free)中查看是否有可用內存,如果有,直接將它從該list_free鏈表中移動到list_all鏈表。
? d.內存釋放過程:要釋放的內存必定保存在list_all中,根據它的大小,把它移動到相應的list_free鏈表。
? e.pool_block_t結構被放置在申請內存的前面,則在釋放時,直接根據Buffer指針就可得到pool_block_t的位置,從而得到next和pre,快速的在鏈表中移動。

2.棧
? 棧在解釋器中用到的地方很多,不管是表達式的解析,還是代碼塊的解析,類型的解析,等等都用到了棧。所以不實現它是不可能的事,不過在數據結構中他是最簡單的了,無非就是申請一個空間,按一個一個的節點保存進去,按一個一個的節點取出來。沒什么技巧在里面,只是這個我讓棧的大小空間是自動增長和減小的,這么做的目的是:棧的空間僅僅限制于內存的大小。但是,這么做得缺點是,當棧的空間大小自動變化時,棧內的數據要被復制一遍,這務必會影響效率。但沒有辦法,暫時之能這樣了。唯一的辦法是在時間和空間上做一個選擇。
? 棧的存儲結構如下:
??
? (圖1.2 棧的存儲結構)
??
typedef struct _stack{
??? int item_len;
??? int item_num;
??? int stack_size;
??? char *p;
}stack_t;
??
? 說明:
? item_len:?? 保存每個節點的長度
? item_num:?? 棧中節點的個數
? stack_size: 棧中可保存的節點個數
? p:????????? 指向棧空間
? a.當節點的個數item_num大于stack_size,那么必須重新申請空間,將原來的數據拷貝到新的空間。
? b.當節點的個數減小到一定的數量時,可以重新申請小的數據空間,釋放原來大的空間。


3.hash表
? hash由于其快速的查找能力而著稱,但是它太浪費內存了,所以用得的比較少,僅僅是在函數的調用時被使用。因為函數的調用是頻繁的,如果從頭查找函數,那將浪費很多的時間。這里引入hash也是必要的。
??
#define HH_TAB_SIZE?128

typedef struct _hh_node{
??? unsigned int hash, klen, dlen;
??? void * key;
??? void * data;
??? struct _hh_node *next;
}hh_node_t;

typedef struct _hh_head{
??? unsigned int node_num;
??? hh_node_t *? node_list;
}hh_head_t;

typedef struct _hh_hash{
??? hh_opts_t opts;
??? hh_head_t tabs[HH_TAB_SIZE];
}hh_hash_t;

typedef struct _hh_opts{
??? int (*cmp_key)(void *key1, void *key2);
??? unsigned int (*get_hash)(void *key);
??? void * (*new_key)(int);
??? void * (*new_data)(int);
??? void (*del_key)(void *key);
??? void (*del_data)(void *data);
}hh_opts_t;

總結

以上是生活随笔為你收集整理的C语言解释器的实现--存储结构(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 最新99热 | 一本加勒比波多野结衣 | 少妇自摸视频 | n0659极腔濑亚美莉在线播放播放 | 久久视频这里只有精品 | 欧美亚洲综合另类 | 国产乱淫av片杨贵妃 | 中文字幕在线观看视频www | 黄色成人在线免费观看 | 国产精品系列在线 | 亚洲一区二区三区免费观看 | 黄色小说视频网站 | 久久久www成人免费精品 | 国产精品五月天 | 天天爽天天插 | 精品无码一区二区三区电影桃花 | jizz中文字幕 | 爱逼综合网| 免费的黄色av | 亚洲图片一区 | 亚洲另类春色 | 美女扒开腿让男人捅 | 久草资源网 | 在线欧美一区二区 | xxx一区| 台湾色综合 | 中文字幕无码精品亚洲35 | 人与动物黄色片 | 三级成人在线 | 亚洲综合激情在线 | 成人亚洲 | 丝袜 中出 制服 人妻 美腿 | 国产精品日韩精品 | 99成人在线视频 | 一区二区三区高清在线 | 老司机在线永久免费观看 | 国产网站免费在线观看 | 女生被草 | 婷婷精品 | 国产玖玖视频 | 青青超碰| 136福利视频导航 | 丰满少妇大力进入 | 又黄又骚又爽 | 丝袜一区二区三区四区 | 日韩精品一区二区三区丰满 | 国产精品午夜电影 | 手机看片福利一区 | 不卡一区在线观看 | 最好看的中文字幕 | 青青草99| 亚洲一区二区日本 | 欧美男同又粗又长又大 | 手机在线不卡av | 亚洲三级国产 | 亚洲一区天堂 | 美女国产视频 | 久久露脸国语精品国产 | 精品人妻无码一区二区色欲产成人 | 伊人网视频在线 | 肉肉av福利一精品导航 | 中文字幕丰满乱子伦无码专区 | 亚洲国产网址 | 天天射狠狠干 | 激情四月 | 中文字幕黄色片 | 日本免费在线一区 | 色窝| 999视频在线播放 | 欧美在线| 亚洲自拍偷拍av | 日韩一区二| 国产无遮挡又黄又爽又色 | 肉丝肉足丝袜一区二区三区 | 在线观看自拍 | 成人免费视频国产免费麻豆 | 狠狠干天天 | 91免费版视频| 韩日在线视频 | 青青草久久| 蜜臀久久99精品久久久久宅男 | 男男啪啪无遮挡 | 免费视频日韩 | 欧美人在线| 女同毛片一区二区三区 | 久久亚洲美女 | 亚洲欧美高清 | 黄色美女免费网站 | 午夜簧片 | 亚洲成人精品在线观看 | 亚洲男女啪啪 | 污网站在线观看免费 | 国产精品免费无遮挡无码永久视频 | 亚洲欧美中文字幕 | 日本九九视频 | 91伦理| 一个色在线 | 人妻少妇偷人精品无码 | 日韩av片在线看 |