Lua-5.3.4代码分析(二)TString字符串

本文详细探讨了Lua-5.3.4中的TString实现,包括关键字字符串的特殊处理、短字符串和长字符串的创建方式,以及字符串的哈希计算策略。特别指出,短字符串在全局字符串表中按链表组织,长字符串的长度存储在联合结构体中。此外,文章还提到了Lua中字符串的惰性哈希计算和使用随机种子来优化哈希冲突问题。
摘要由CSDN通过智能技术生成

先看LUA中关于字符串TString的源码:

/*
** Header for string value; string bytes follow the end of this structure
** (aligned according to 'UTString'; see next).
*/
typedef struct TString {
  CommonHeader;//可GC对象的头
  lu_byte extra;  /* reserved words for short strings; "has hash" for longs */ //标记是否是虚拟机保留的字符串,如果是短字符串,1就是lua中保留的字符串(关键字),不可GC;长字符串1表示已经hash.
  lu_byte shrlen;  /* length for short strings *///短字符串的长度
  unsigned int hash;//字符串的hash值,字符串的比较可以通过hash值
  union {
    size_t lnglen;  /* length for long strings */  //长字符串的长度
    struct TString *hnext;  /* linked list for hash table *///指向下一个字符串
  } u;
} TString;


/*
** Ensures that address after this type is always fully aligned.
**L_Umaxalign是一个宏,用来保证UTString结构里的TString按照这个长度来对齐
*/
typedef union UTString {
  L_Umaxalign dummy;  /* ensures maximum alignment for strings */
  TString tsv;
} UTString;

extra值是1时表示是虚拟器中保留的字符串,也就是关键字,是不支持自动回收的,在GC过程中会略过对这个字符串的处理.

/* ORDER RESERVED */
static const char *const luaX_tokens [] = {
    "and", "break", "do", "else", "elseif",
    "end", "false", "for", "function", "goto", "if",
    "in", "local", "nil", "not", "or", "repeat",
    "return", "then", "true", "until", "while",
    "//", "..", "...", "==", ">=", "<=", "~=",
    "<<", ">>", "::", "<eof>",
    "<number>", "<integer>", "<name>", "<string>"
};
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值