首页 > 代码库 > lua.5.2.3源码阅读(02):字符串对象

lua.5.2.3源码阅读(02):字符串对象

lua中的字符串是对象,主要分析一下对象的结构和申请的方式。

TString是一个union,为了进行字节对齐,中间插入了L_Umaxalign,按照union的定义

union的大小,必须是单个结构大小的整数倍,按照目前的定义,应该是double大小的整数倍。

 1 /* type to ensure maximum alignment */ 2 #if !defined(LUAI_USER_ALIGNMENT_T) 3 #define LUAI_USER_ALIGNMENT_T    union { double u; void *s; long l; } 4 #endif 5  6 typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; 7  8 /* 9 ** Header for string value; string bytes follow the end of this structure10 */11 typedef union TString {12   L_Umaxalign dummy;  /* ensures maximum alignment for strings */13   struct {14     CommonHeader;15     lu_byte extra;  /* reserved words for short strings; "has hash" for longs */16     unsigned int hash;17     size_t len;  /* number of characters in string */18   } tsv;19 } TString;20 21 /*22 ** Common Header for all collectable objects (in macro form, to be23 ** included in other objects)24 */25 #define CommonHeader    GCObject *next; lu_byte tt; lu_byte marked

展开上述定义,实际TString的关键定义:

1   struct {2     GCObject *next; 3     lu_byte tt; 4     lu_byte marked;5     lu_byte extra;  /* reserved words for short strings; "has hash" for longs */6     unsigned int hash;7     size_t len;  /* number of characters in string */8   } tsv;

tt用于表示GC对象的类型,marked用于GC收集的时候的类型,后续再分析,extra标记是否为lua的保留字符串,hash为短字符串的哈希值,len为字符串的长度。

lua.5.2.3源码阅读(02):字符串对象