Lua的字符串对象表示为下面结构:
typedef struct TString {
CommonHeader;
// 字符串的子类型有两种:长字符串和短字符串
// 短字符串:extra表示Lua保留字的索引,如果为0就不是保留字
// 长字符串:extra标记是否已经计算哈希值,0表示还未计算
lu_byte extra;
lu_byte shrlen; // 短字符串长度
unsigned int hash; // 字符串的哈希值
// 下面联合分两种情况:
// 如果是长字符串则是长度lnglen
// 如果是短字符串则是hnext,指向下一个短字符串对象,短字符串会用哈希表缓存,
union {
size_t lnglen;
struct TString *hnext;
} u;
} TString;
一个Lua字符串在内存中的布局是这样的:
字符串内容会在有效数据的结尾强制加上0,所以字符串对象的总大小为:
// 计算字符串对象的总大小:|TString|有效内容|
#define sizelstring(l) (sizeof(union UTString) + ((l) +