lua字符串转数组_深入Lua:字符串管理

本文深入探讨Lua中的字符串管理,包括短字符串的哈希表缓存,确保相同内容的短字符串在虚拟机中只有一份,提高查找效率。长字符串在首次调用哈希函数时计算,并采用采样方式减少计算成本。此外,还介绍了针对零结尾字符串的额外缓存策略。
摘要由CSDN通过智能技术生成

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字符串在内存中的布局是这样的:

0b72f685dc36a082d56438028d9d0542.png

字符串内容会在有效数据的结尾强制加上0,所以字符串对象的总大小为:

// 计算字符串对象的总大小:|TString|有效内容|
#define sizelstring(l)  (sizeof(union UTString) + ((l) + 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值