lua 1.0 源码分析 -- 2 内存回收
说这个,先要说下 lua 的环境,正常说创建一个 lua 的虚拟环境,就是创建一组全局变量, lua1.0 里创建的主要是以下几个:
extern Symbol *lua_table; /* 符号数组 */ extern Word lua_ntable; extern char **lua_constant; /* 常量数组 */ extern Word lua_nconstant; extern char **lua_string; /* 字符数组 */ extern Word lua_nstring; extern Hash **lua_array; /* Hash 数组, 这个结构存的东西基本没有不能存的 */ extern Word lua_narray; extern char *lua_file[]; /* lua 操作的文件描述数组 */ extern int lua_nfile; static Object stack[MAXSTACK] ; /* 虚拟指令操作的 stack */
内存的回收 lua 的思想比较简单,就是 检查 lua_array, lua_string 中的成员是否在 stack 中, 不在的话就移除。
具体的实现就是标记 stack , 遍历数组, 因为在入数组的时候,是 strdup,直接 释放就好了,所以效率会很好。 lua_array 的思想一样。
/* ** Simulate a garbage colection. When string table or array table overflows, ** this function check if all allocated strings and arrays are in use. If ** there are unused ones, pack (compress) the tables. */ static void lua_pack (void) { lua_markstack (); lua_marktable (); { /* pack string */ int i, j; for (i=j=0; i<lua_nstring; i++) if (lua_markstring(lua_string[i]) == 1) { lua_string[j++] = lua_string[i]; lua_markstring(lua_string[i]) = 0; } else { free (lua_string[i]-1); } lua_nstring = j; } { /* pack array */ int i, j; for (i=j=0; i<lua_narray; i++) if (markarray(lua_array[i]) == 1) { lua_array[j++] = lua_array[i]; markarray(lua_array[i]) = 0; } else { lua_hashdelete (lua_array[i]); } lua_narray = j; } }
很多时候我都在期待3年后的自己是一个什么样的,5年后自己又是一个什么样的。因为未知,所以生命才更加精彩。
标签:
lua 的内存回收
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一文搞懂MCP协议与Function Call的区别
· 一次Java后端服务间歇性响应慢的问题排查记录