自制编程语言crowbar(v0.1)构建解析器时分配内存
crowbar中第一次申请内存是在生成解析器的时候:
/* interface.c */CRB_Interpreter *CRB_create_interpreter(void) {MEM_Storage storage;CRB_Interpreter *interpreter;storage = MEM_open_storage(0);interpreter = MEM_storage_malloc(storage,sizeof(struct CRB_Interpreter_tag));interpreter->interpreter_storage = storage;interpreter->execute_storage = NULL;interpreter->variable = NULL;interpreter->function_list = NULL;interpreter->statement_list = NULL;interpreter->current_line_number = 1;crb_set_current_interpreter(interpreter);add_native_functions(interpreter);return interpreter; }
首先看一下MEM_Storage类型,声明:
/* MEM.h */ typedef struct MEM_Storage_tag *MEM_Storage;
/* MEM/storage.c */ struct MEM_Storage_tag {MemoryPageList page_list;int current_page_size; };typedef MemoryPage *MemoryPageList;typedef struct MemoryPage_tag MemoryPage;struct MemoryPage_tag {int cell_num;int use_cell_num;MemoryPageList next;Cell cell[1]; };typedef union {long l_dummy;double d_dummy;void *p_dummy; } Cell;
结构图:(cell是union)
再接着看MEM_open_storage(0):
/* MEM.h */#define MEM_open_storage(page_size)(MEM_open_storage_func(MEM_CURRENT_CONTROLLER, __FILE__, __LINE__, page_size))
/* MEM/storage.c */ MEM_Storage MEM_open_storage_func(MEM_Controller controller,char *filename, int line, int page_size) {MEM_Storage storage;storage = MEM_malloc_func(controller, filename, line,sizeof(struct MEM_Storage_tag));storage->page_list = NULL;assert(page_size >= 0);if (page_size > 0) {storage->current_page_size = page_size;} else {storage->current_page_size = DEFAULT_PAGE_SIZE;}return storage; }
MEM_open_storage函数传了一个MEM_CURRENT_CONTROLLER宏,那接下来看一下这个宏定义:
/* MEM.h */typedef struct MEM_Controller_tag *MEM_Controller; extern MEM_Controller mem_default_controller; #ifdef MEM_CONTROLLER #define MEM_CURRENT_CONTROLLER MEM_CONTROLLER #else /* MEM_CONTROLLER */ #define MEM_CURRENT_CONTROLLER mem_default_controller #endif /* MEM_CONTROLLER */
MEM_Controller_tag的定义:
/* MEM/memory.h */typedef union Header_tag Header;struct MEM_Controller_tag {FILE *error_fp;MEM_ErrorHandler error_handler;MEM_FailMode fail_mode;Header *block_header; }; /* MEM.h */typedef void (*MEM_ErrorHandler)(MEM_Controller, char *, int, char *); typedef enum { MEM_FAIL_AND_EXIT, MEM_FAIL_AND_RETURN} MEM_FailMode;
其中Header_tag定义:
/* MEM/memory.c */ union Header_tag {HeaderStruct s;Align u[HEADER_ALIGN_SIZE]; }; #define MARK_SIZE (4)#define ALIGN_SIZE (sizeof(Align)) #define revalue_up_align(val) ((val) ? (((val) - 1) / ALIGN_SIZE + 1) : 0) #define HEADER_ALIGN_SIZE (revalue_up_align(sizeof(HeaderStruct)))#define MARK (0xCD)typedef struct {int size;char *filename;int line;Header *prev;Header *next;unsigned char mark[MARK_SIZE]; } HeaderStruct;typedef union {long l_dummy;double d_dummy;void *p_dummy; } Align;
可以看到在MEM_open_storage_func()中调用了MEM_malloc_func(),MEM_malloc_func原型:
/* MEM/memory.c */void *MEM_malloc_func(MEM_Controller controller, char *filename, int line, size_t size) {void *ptr;size_t alloc_size;#ifdef DEBUGalloc_size = size + sizeof(Header) + MARK_SIZE; #elsealloc_size = size; #endifptr = malloc(alloc_size);if (ptr == NULL) {error_handler(controller, filename, line, "malloc");} #ifdef DEBUGmemset(ptr, 0xCC, alloc_size);set_header(ptr, size, filename, line);set_tail(ptr, alloc_size);chain_block(controller, (Header*)ptr);ptr = (char*)ptr + sizeof(Header); #endifreturn ptr; }
其中的DEBUG代码暂时先不管。那到这里为止已经从内存中申请了DEFAULT_PAGE_SIZE(1024)大小的内存给了MEM_Storage storage变量
接着看 interpreter = MEM_storage_malloc(storage, sizeof(struct CRB_Interpreter_tag));
MEM_storage_malloc原型:
/* MEM.h */#define MEM_storage_malloc(storage, size) (MEM_storage_malloc_func(MEM_CURRENT_CONTROLLER,__FILE__, __LINE__, storage, size)) /* MEM/storage.c */ void *MEM_storage_malloc_func(MEM_Controller controller, char *filename, int line, MEM_Storage storage, size_t size) {int cell_num;MemoryPage *new_page;void *p;cell_num = ((size - 1) / CELL_SIZE) + 1;/* 如果storage中已经用到的cell加上将要分配的cell小于storage中所有的cell则从storage中取出一个cell返回 */if (storage->page_list != NULL&& (storage->page_list->use_cell_num + cell_num< storage->page_list->cell_num)) {p = &(storage->page_list->cell[storage->page_list->use_cell_num]);storage->page_list->use_cell_num += cell_num; /* 否则则重新从内存中申请 */} else {int alloc_cell_num;alloc_cell_num = larger(cell_num, storage->current_page_size);new_page = MEM_malloc_func(controller, filename, line,sizeof(MemoryPage)+ CELL_SIZE * (alloc_cell_num - 1));new_page->next = storage->page_list;new_page->cell_num = alloc_cell_num;storage->page_list = new_page;p = &(new_page->cell[0]);new_page->use_cell_num = cell_num;}return p; }
到此解析器的构建中内存分配已分析完
自制编程语言crowbar(v0.1)构建解析器时分配内存相关推荐
- 自制C#版3DS文件的解析器并用SharpGL显示3DS模型
阅读目录(Content) 3DS文件格式 块(Chunk)的结构 解析结果 自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.c ...
- 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 7.)(笔记)解释器 interpreter 解析器 parser 抽象语法树AST
[编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 7.) 文章目录 python代码 插--后序遍历 C语言代码(有错误) C语言 ...
- 解析器生成器 ANTLR的详细介绍
什么是ANTLR ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,用于读取.处理.执行和翻译结构化文本或二进制文件.它被广泛应用于构建 ...
- wireshark协议解析器原理与插件编写
工作原理 每个解析器解码自己的协议部分, 然后把封装协议的解码传递给后续协议. 因此它可能总是从一个Frame解析器开始, Frame解析器解析捕获文件自己的数据包细节(如:时间戳), 将数据交给一个 ...
- 笨办法学 Python · 续 练习 33:解析器
练习 33:解析器 原文:Exercise 33: Parsers 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 想象一下,你将获得一个巨大的数字列表,你必须将其输入到电子表格 ...
- 解析器 java_Java高性能解析器实现思路及方法学习
当你必须自己实现一个解析器时,你对它的期望会有很多,包括性能良好.灵活.特性丰富.方便使用,以及便于维护等等.说到底,这也是你自己的代码.在本文中,我将为你介绍在Java中实现高性能解析器的一种方式, ...
- csv解析java_Java CSV解析器
csv解析java Welcome to the Java CSV Parser tutorial. CSV files are one of the most widely used format ...
- java 解析器_高性能Java解析器实现过程详解
如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...
- 高性能Java解析器实现过程详解
如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...
最新文章
- docker 删除容器_Docker使用命令和技巧
- BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
- 我的这10年——从机械绘图 到 炼油 到 微软MVP 的华丽转身
- 艰难就业季,2020 AI算法岗春招汇总 面经大全来了!!!
- poj 3254 Corn Fields 状态压缩dp
- LeetCode-动态规划基础题-62. 不同路径
- python条形图颜色设置_python – 根据值在matplotlib中更改3D条形图中的条形颜色
- 安装mysql-connector-python-8.0.11-py3.6遇到问题
- 《星辰傀儡线》人物续:“灭世者”、“疯狂者”、“叛逆者”三兄妹
- html的opacity标签,css中opacity是什么意思
- linux tar 命令
- c语言单词的一个字母变换,c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串知道...
- python安装后使用_Python安装后如何使用?
- FPGA 429 接口设计
- java jshell_JDK11 | 第二篇 : JShell 工具
- 经纬度校验、整数和小数校验
- 使用JOPENS-MSDP系统进行简单的地震定位
- 有什么软件可以裁剪html文件,什么软件能剪切歌曲 怎么剪切歌曲的一部分
- 基于 HTML5 WebGL 的 3D 水泥工厂生产线
- 学校对计算机教师的检查要求,计算机学院2015-2016学年第二学期期中教学检查方案...
热门文章
- 人工智能技术应用实践白皮书
- 微软短信服务器一直不可用,即时消息客户端功能不可用 - Outlook | Microsoft Docs
- 【架构设计】酒店预订应用程序的系统设计架构(如 Airbnb、OYO)
- package.json中bin字段的用处
- Unity2D入门(九):敌人的移动、消灭敌人(包括动画的触发)
- SpringCloud:Eureka服务down状态日志解析
- VS2017 提示 无法找到 v140 的生成工具(平台工具集 =“v140”)
- ARM中跳转指令BL/BLX偏移值计算规则
- Qt实现360桌面精灵
- 微创拔牙及口腔门诊小手术实用图谱