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 structure 10 */ 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 be 23 ** 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为字符串的长度。
时间: 2024-12-05 13:38:04