美文网首页Lua点滴LuaLua
lua 5.3.4 GC管理对象类型的变化

lua 5.3.4 GC管理对象类型的变化

作者: 云木unity | 来源:发表于2017-09-29 11:33 被阅读31次

    Lua 5.1.4

    判断是否需要GC:

    #define ttype(o)    ((o)->tt)
    #define iscollectable(o)    (ttype(o) >= LUA_TSTRING)
    

    GC对象GCObject union:

    /*
    ** Union of all collectable objects
    */
    union GCObject {
      GCheader gch;
      union TString ts;
      union Udata u;
      union Closure cl;
      struct Table h;
      struct Proto p;
      struct UpVal uv;
      struct lua_State th;  /* thread */
    };
    

    作为 GC 对象被虚拟机的 标记-清除 GC 所管理的类型有:

    1. string
    2. userdata
    3. Closure(function)
    4. table
    5. thread
    6. Proto
    7. UpVal

    Lua 5.3.4

    #define TValuefields    Value value_; int tt_
    
    struct lua_TValue {
      TValuefields;
    };
    
    typedef struct lua_TValue TValue;
    

    ==> TValue =

    struct lua_TValue {
          Value value_; 
          int tt_;
        };
    

    其中,tt_是tag type的简写,复合类型,用来表示类型,一共包含三个部分,分别是:

    /*
    ** tags for Tagged Values have the following use of bits:
    ** bits 0-3: actual tag (a LUA_T* value) 
    ** bits 4-5: variant bits 
    ** bit 6: whether value is collectable 
    */
    
    1. 0-3表示大类型
    2. 4-5表示表示类型的变体,例如:字符串LUA_TSTRING有两种变体(短字符串:LUA_TSHRSTR和长字符串:LUA_TLNGSTR)
    3. 6表示是否可以垃圾回收

    标记为需标记-清除 GC 所管理的对象:

    #define BIT_ISCOLLECTABLE   (1 << 6) = 64 = 0100 0000
    
    /* mark a tag as collectable */
    #define ctb(t)          ((t) | BIT_ISCOLLECTABLE)
    

    判断是否需要GC:

    #define rttype(o)   ((o)->tt_)
    
    #define iscollectable(o)    (rttype(o) & BIT_ISCOLLECTABLE)
    

    GC对象union:

    /*
    ** Union of all collectable objects (only for conversions)
    */
    union GCUnion {
      GCObject gc;  /* common header */
      struct TString ts;
      struct Udata u;
      union Closure cl;
      struct Table h;
      struct Proto p;
      struct lua_State th;  /* thread */
    };
    

    作为 GC 对象被虚拟机的 标记-清除 GC 所管理的类型有:

    1. string
    2. userdata
    3. Closure(function)
    4. table
    5. thread
    6. Proto

    要注意的是:

    UpVal 对象不再作为 GC 对象被虚拟机的 标记-清除GC 所管理,而是单独使用引用计数的方法管理。

    链接:UpVal变为引用计数

    相关文章

      网友评论

        本文标题:lua 5.3.4 GC管理对象类型的变化

        本文链接:https://www.haomeiwen.com/subject/qxciextx.html