crowbar中第一次申请内存是在生成解析器的时候:

/* interface.c */
CRB_Interpreter *CRB_create_interpreter(void)
{
MEM_Storage storage;
CRB_Interpreter *interpreter; storage = MEM_open_storage();
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 = ; 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[];
}; typedef union {
long l_dummy;
double d_dummy;
void *p_dummy;
} Cell;

结构图:(cell是union)

aaarticlea/png;base64,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" alt="" />

再接着看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 >= );
if (page_size > ) {
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 DEBUG
alloc_size = size + sizeof(Header) + MARK_SIZE;
#else
alloc_size = size;
#endif
ptr = malloc(alloc_size);
if (ptr == NULL) {
error_handler(controller, filename, line, "malloc");
}
#ifdef DEBUG
memset(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);
#endif return 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 - ) / CELL_SIZE) + ;
  /* 如果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 - ));
new_page->next = storage->page_list;
new_page->cell_num = alloc_cell_num;
storage->page_list = new_page; p = &(new_page->cell[]);
new_page->use_cell_num = cell_num;
} return p;
}

到此解析器的构建中内存分配已分析完

												

自制编程语言crowbar(v0.1)构建解析器时分配内存的更多相关文章

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

    自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse ...

  2. 构建WebGL目标时的内存考量

    Memory Considerations when targeting WebGL 构建WebGL目标时的内存考量 Memory in Unity WebGL can be a constraini ...

  3. Python 之父再发文:构建一个 PEG 解析器

    花下猫语: Python 之父在 Medium 上开了博客,现在写了两篇文章,本文是第二篇的译文.前一篇的译文 在此 ,宣布了将要用 PEG 解析器来替换当前的 pgen 解析器. 本文主要介绍了构建 ...

  4. 【译】通过 Rust 学习解析器组合器 — Part 1

    原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...

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

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

  6. 如何实现一个SQL解析器

    ​作者:vivo 互联网搜索团队- Deng Jie 一.背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进 ...

  7. Spring Web MVC 多viewResolver视图解析器解决方案

    viewResolver的定义如下: public interface ViewResolver { View resolveViewName(String viewName, Locale loca ...

  8. PHP Simple HTML DOM解析器

    一直以来使用php解析html文档树都是一个难题.Simple HTML DOM parser 帮我们很好地解决了使用 php html 解析 问题.可以通过这个php类来解析html文档,对其中的h ...

  9. PHP XML Expat 解析器

    PHP XML Expat 解析器 内建的 Expat 解析器使在 PHP 中处理 XML 文档成为可能. XML 是什么? XML 用于描述数据,其焦点是数据是什么.XML 文件描述了数据的结构. ...

随机推荐

  1. Spark ZooKeeper数据恢复

    Spark使用ZooKeeper进行数据恢复的逻辑过程如下: 1.初始化:创建<CuratorFramwork,LeaderLatch,LeaderLatchListener>用于选举 创 ...

  2. haha2

    # YOU - fhasd - fdks jf > jd sfkjd sf ```python print "helloworld" ``` 来自为知笔记(Wiz)

  3. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  4. 页面加载完成后,触发事件——trigger()

    <button id="btn">点击我</button> <div id="test"></div> 如果页面 ...

  5. 关于html5新增的功能(百度)

    HTML5包含以下新增和更新功能: 1. 新增了一种HTML文档类型:<DOCTYPE html>   2. 新增了一些结构化标记的元素(<header>,<nav> ...

  6. iphone中input标签会多出一块的解决办法

    -webkit-appearance: none;

  7. tornado web 框架的认识

    tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...

  8. LabVIEW 吸星大法 - 看见的好东西都是我的(下篇)

    前言 写了多年的LabVIEW程序,你是否面临这样的问题 总是在做一些重复的工作,感觉很没有意思: 总在不停的写代码,做类似的控件,实现相同的功能,丝毫没有成就感: 总在天加班,没有时间去提高自己; ...

  9. Comparing the MSTest and Nunit Frameworks

    I haven't seen much information online comparing the similarities and differences between the Nunit ...

  10. Visual Studio 2015 各版本对比及下载地址

    2015年7月20日23时30分,微软举行了Visual Studio 2015的发布会,跟随者Visual Studio 2015 而来的是,.net 开源,C#支持wp,ios,android三大 ...