【Lua 5.3源码】Lua 新旧String 对比

一.在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) {
   
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值