lua 5.3.4 GC 관리 객체 유형의 변화

2242 단어

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 지우기가 관리하는 유형은 다음과 같습니다.
  • string
  • userdata
  • Closure(function)
  • table
  • thread
  • Proto
  • 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_;
        };
    

    여기서 tttag 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 
    */
    
  • 0-3은 큰 유형을 나타낸다
  • 4-5는 유형의 변형을 나타냅니다(예: 문자열 LUA)TSTRING에는 두 가지 변형이 있습니다(짧은 문자열: LUA TSHRSTR 및 긴 문자열: LUA TLNGSTR)
  • 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 지우기가 관리하는 유형은 다음과 같습니다.
  • string
  • userdata
  • Closure(function)
  • table
  • thread
  • Proto

  • 주의해야 할 점:
    UpVal 객체는 더 이상 가상 머신에서 GC 객체로 태그 지정되지 않으며 GC에서 관리되는 GC를 지우는 대신 참조 수를 사용하여 개별적으로 관리됩니다.
    링크:UpVal에서 참조 수로 변경

    좋은 웹페이지 즐겨찾기