-
从0到1抖音运营变现:全局状态机手册大全
资源介绍
由田 第二章 全局状态机及内存管理
甹男 return newblock;
甹甸 }
从代码中可以看到,畬畵畡畍 畲略畡畬畬畯畣 根据传入的 畯畳畩畺略 和 畮畳畩畺略 调整内部感知的内存大小(设置 畇畃畤略畢畴),
在内存不够用的时候会主动尝试做 畇畃 操作。
畬畭略畭甮畣 中还有另一个内部 畁畐畉 畬畵畡畍 畧畲畯畷畡畵畸 ,它是用来管理可变长数组的。其主要策略是当数组空
间不够时,扩大为原来的两倍。
源代码 甲甮甴町 畬畭略畭甮畣町 畧畲畯畷當略畣畴畯畲
甴甶 void *luaM_growaux_ (lua_State *L, void *block , int *size , size_t
size_elems ,
甴男 int limit , const char *what) {
甴甸 void *newblock;
甴甹 int newsize;
电田 if (*size >= limit /2) { /* cannot double it? */
电由 if (*size >= limit) /* cannot grow even a little? */
电甲 luaG_runerror(L, "too many %s (limit is %d)", what , limit);
电申 newsize = limit; /* still have at least one free place */
电甴 }
电电 else {
电甶 newsize = (*size)*2;
电男 if (newsize < MINSIZEARRAY)
电甸 newsize = MINSIZEARRAY; /* minimum size */
电甹 }
甶田 newblock = luaM_reallocv(L, block , *size , newsize , size_elems);
甶由 *size = newsize; /* update only when everything else is OK */
甶甲 return newblock;
甶申 }
由 #define luaM_growvector(L,v,nelems ,size ,t,limit ,e) \
甲 if (( nelems)+1 > (size)) \
申 ((v)=cast(t *, luaM_growaux_(L,v,&( size),sizeof(t),limit ,e)))
2.2 全局状态机
从 界畵畡 的使用者的角度看,畧畬畯畢畡畬 畓畴畡畴略 是不可见的。我们无法用公开的 畁畐畉 取到它的指针,也不需要
引用它。但分析 界畵畡 的实现就不能绕开这个部分。
畧畬畯畢畡畬 畓畴畡畴略 里面有对主线程的引用,有注册表管理所有全局数据,有全局字符串表,有内存管理函数,
有 畇畃 需要的把所有对象串联起来的相关信息,以及一切 界畵畡 在工作时需要的工作内存。
通过 畬畵畡 畮略畷畳畴畡畴略 创建一个新的 界畵畡 虚拟机时,第一块申请的内存将用来保存主线程和这个全局状态
机。界畵畡 的实现尽可能的避免内存碎片,同时也减少内存分配和释放的次数。它采用了一个小技巧,利用一
个 界畇 结构,把主线程 畬畵畡 畓畴畡畴略 和 畧畬畯畢畡畬 畓畴畡畴略 分配在一起。
- 上一篇: 函数原型-从0到1抖音运营变现手册大全
- 下一篇: 对元方法的优化-从0到1抖音运营变现手册大全