• 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;
     }
    }
  • 相关阅读:
    UINavigationController的简单使用
    UIApplication
    NSOperation开启线程情况分析
    NSOperation & NSOperationQueue
    GCD 多线程 Ios 补充
    GCD中不同队列 配合 不同函数的 情况分析
    GCD详解
    is,as,sizeof,typeof,GetType
    人人必知的10个jQuery小技巧
    移动设备wap手机网页html5通过特殊链接:打电话,发短信,发邮件详细教程
  • 原文地址:https://www.cnblogs.com/ashen/p/11555697.html
Copyright © 2020-2023  润新知