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;
 }
}
复制代码

 

posted @   ashen~  阅读(272)  评论(0编辑  收藏  举报
编辑推荐:
· 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后端服务间歇性响应慢的问题排查记录
点击右上角即可分享
微信分享提示