-
抖音运营变现手册大全:从0到1全面解析全局状态机及内存管理
资源介绍
甸 第二章 全局状态机及内存管理
甹申田 luai_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n
",
甹申由 lua_tostring(L, -1));
甹申甲 return 0; /* return to Lua to abort */
甹申申 }
甹申甴
甹申电
甹申甶 LUALIB_API lua_State *luaL_newstate (void) {
甹申男 lua_State *L = lua_newstate(l_alloc , NULL);
甹申甸 if (L) lua_atpanic(L, &panic);
甹申甹 return L;
甹甴田 }
界畵畡 定义的内存管理器仅有一个函数,虽然接口上类似 畲略畡畬畬畯畣 但是和 畃 标准库中的 畲略畡畬畬畯畣 有所区别。
它需要在 畮畳畩畺略 为 田 时,提供释放内存的功能。
和标准库中的内存管理接口不同,界畵畡 在调用它的时候会准确给出内存块的原始大小。对于需要为 界畵畡
定制一个高效的内存管理器来说,这个信息很重要。因为大多数内存管理的算法,都需要在释放内存的时候
了解内存块的尺寸。而标准库的 畦畲略略 和 畲略畡畬畬畯畣 函数却不给出这个信息。所以大多数内存管理模块在实现时,
在内存块的前面加了一个 畣畯畯畫畩略 ,把内存块尺寸存放在里面。界畵畡 在实现时,刻意提供了这个信息。这样我
们不必额外储存内存块尺寸,这对大量使用小内存块的环境可以节约不少内存。
另外,这个内存管理接口接受一个额外的指针 畵畤。这可以让内存管理模块工作在不同的堆上。恰当的
定制内存管理器,就可以回避线程安全问题。不考虑线程安全的因素,我们可以让内存管理工作更为高效。
另一个可以辅助我们做出更有效的内存管理模块的机制是在 界畵畡 电甮甲 时增加的。当 異畴畲 传入 畎畕界界 时,
畯畳畩畺略 的含义变成了对象的类型。这样,分配器就可以得知我们是在分配一个什么类型的对象,可以针对它做
一些统计或优化工作。
界畵畡 使用了一组宏来管理不同类别的内存:单个对象、数组、可变长数组等。这组宏定义在 畬畭略畭甮畨
中。
源代码 甲甮甲町 畬畭略畭甮畨町 畭略畭畯畲畹
由男 #define luaM_reallocv(L,b,on,n,e) \
由甸 ((cast(size_t , (n)+1) > MAX_SIZET /(e)) ? /* +1 to avoid warnings
*/ \
由甹 (luaM_toobig(L), (void *)0) : \
甲田 luaM_realloc_(L, (b), (on)*(e), (n)*(e)))
甲由
甲甲 #define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0)
甲申 #define luaM_free(L, b) luaM_realloc_(L, (b), sizeof (*(b)), 0)
甲甴 #define luaM_freearray(L, b, n) luaM_reallocv(L, (b), n, 0, sizeof ((b)
[0]))
甲电
甲甶 #define luaM_malloc(L,s) luaM_realloc_(L, NULL , 0, (s))
甲男 #define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t)))
- 上一篇: 阅读源代码的次序-从0到1抖音运营变现手册大全
- 下一篇: 函数原型-从0到1抖音运营变现手册大全