一.在Lua5.1.4版本中TString的实现如下:
typedef union TString {
L_Umaxalign dummy; /* ensures maximum alignment for strings */
struct {
CommonHeader;
lu_byte reserved;
unsigned int hash;
size_t len;
} tsv;
} TString;
- dummy : 用于对齐
- CommonHeader : gc对象的标准头
- reserved : 是否是Lua虚拟机的保留字段(关键字),如果为1,则不会被gc回收
- hash : 字符串的散列值
- len : 字符串长度
在Lua5.3.4版本中TString的实现如下:
typedef struct TString {
CommonHeader;
lu_byte extra; /* reserved words for short strings; "has hash" for longs */
lu_byte shrlen; /* length for short strings */
unsigned int hash;
union {
size_t lnglen; /* length for long strings */
struct TString *hnext; /* linked list for hash table */
} u;
} TString;
- CommonHeader
- extra: luaX_init中使用到这个, 用来表示是关键字类别.
- shrlen: 短字符串的长度
- hash: hash值
- u.lnglen: 长字符串的长度
- u.hnext: 如果出现hash碰撞, 则将碰撞内容链接到链表内
二.Lua5.1.4的实现中无论对于长字符串还是短字符串都是使用的stringtable来存入散列桶
typedef struct global_State {
stringtable strt; /* hash table for strings */
...
}
Lua5.3.4的实现中对于长字符串是单独存储,并使用strcache来缓存,对于短字符串还是像原来一样存储在stringtable中.
//lstring.c
#define LUAI_MAXSHORTLEN 40
TString* luaS_newlstr (lua_State *L, const char *str, size_t l) {