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)构建解析器时分配内存相关推荐

  1. 自制C#版3DS文件的解析器并用SharpGL显示3DS模型

    阅读目录(Content) 3DS文件格式 块(Chunk)的结构 解析结果 自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.c ...

  2. 【编译原理】构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 7.)(笔记)解释器 interpreter 解析器 parser 抽象语法树AST

    [编译原理]让我们来构建一个简单的解释器(Let's Build A Simple Interpreter. Part 7.) 文章目录 python代码 插--后序遍历 C语言代码(有错误) C语言 ...

  3. 解析器生成器 ANTLR的详细介绍

    什么是ANTLR ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,用于读取.处理.执行和翻译结构化文本或二进制文件.它被广泛应用于构建 ...

  4. wireshark协议解析器原理与插件编写

    工作原理 每个解析器解码自己的协议部分, 然后把封装协议的解码传递给后续协议. 因此它可能总是从一个Frame解析器开始, Frame解析器解析捕获文件自己的数据包细节(如:时间戳), 将数据交给一个 ...

  5. 笨办法学 Python · 续 练习 33:解析器

    练习 33:解析器 原文:Exercise 33: Parsers 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 想象一下,你将获得一个巨大的数字列表,你必须将其输入到电子表格 ...

  6. 解析器 java_Java高性能解析器实现思路及方法学习

    当你必须自己实现一个解析器时,你对它的期望会有很多,包括性能良好.灵活.特性丰富.方便使用,以及便于维护等等.说到底,这也是你自己的代码.在本文中,我将为你介绍在Java中实现高性能解析器的一种方式, ...

  7. csv解析java_Java CSV解析器

    csv解析java Welcome to the Java CSV Parser tutorial. CSV files are one of the most widely used format ...

  8. java 解析器_高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  9. 高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

最新文章

  1. docker 删除容器_Docker使用命令和技巧
  2. BZOJ1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
  3. 我的这10年——从机械绘图 到 炼油 到 微软MVP 的华丽转身
  4. 艰难就业季,2020 AI算法岗春招汇总 面经大全来了!!!
  5. poj 3254 Corn Fields 状态压缩dp
  6. LeetCode-动态规划基础题-62. 不同路径
  7. python条形图颜色设置_python – 根据值在matplotlib中更改3D条形图中的条形颜色
  8. 安装mysql-connector-python-8.0.11-py3.6遇到问题
  9. 《星辰傀儡线》人物续:“灭世者”、“疯狂者”、“叛逆者”三兄妹
  10. html的opacity标签,css中opacity是什么意思
  11. linux tar 命令
  12. c语言单词的一个字母变换,c语言:输入一行英文字符串,把每个单词第一个字母变为大写,输出修改后的字符串知道...
  13. python安装后使用_Python安装后如何使用?
  14. FPGA 429 接口设计
  15. java jshell_JDK11 | 第二篇 : JShell 工具
  16. 经纬度校验、整数和小数校验
  17. 使用JOPENS-MSDP系统进行简单的地震定位
  18. 有什么软件可以裁剪html文件,什么软件能剪切歌曲 怎么剪切歌曲的一部分
  19. 基于 HTML5 WebGL 的 3D 水泥工厂生产线
  20. 学校对计算机教师的检查要求,计算机学院2015-2016学年第二学期期中教学检查方案...

热门文章

  1. 人工智能技术应用实践白皮书
  2. 微软短信服务器一直不可用,即时消息客户端功能不可用 - Outlook | Microsoft Docs
  3. 【架构设计】酒店预订应用程序的系统设计架构(如 Airbnb、OYO)
  4. package.json中bin字段的用处
  5. Unity2D入门(九):敌人的移动、消灭敌人(包括动画的触发)
  6. SpringCloud:Eureka服务down状态日志解析
  7. VS2017 提示 无法找到 v140 的生成工具(平台工具集 =“v140”)
  8. ARM中跳转指令BL/BLX偏移值计算规则
  9. Qt实现360桌面精灵
  10. 微创拔牙及口腔门诊小手术实用图谱