Lua 字符串TString数据结构即算法分析

这里主要写Lua中的字符串TString相关结构和算法。文章中没有贴Lua源码,只画出了结构图,和算法的伪代码。这样阅读起来更加直观。

一、TString的概述

1、lua中字符串是常量,例s = s .. 1 创建了一个新的字符串赋值给s,并不是改变了s字符串中的数据。
2、lua中字符串分为长字符串和短字符串。
长字符串和短字符串区别
(1)存储方式:
短字符串:全局存储一份
长字符串:多份
(2)hash值计算时机:
短字符串:创建时立刻计算
长字符串:惰性计算,使用时在计算(例如字符串做table的key时)

二、数据结构
1、TString结构
extra:
短字符串:是否是保留字
长字符串:是否计算了hash
strlen:短字符串长度
hash:字符串hash值
lngLen:长字符串长度
hNext:桶hash表冲突时,指向下个节点的指针
TString后边跟着的是字符串数据

2、stringtable
stringtable存储在g_state中
hash:指向保存了短字符串指针的桶数组
nuse:数组中字符串数量
size:数组大小
三、算法
这里只写伪代码,这样看上去更加直观。
1、创建
{
短字符串:
计算hash值
是否已经存在字符串
是:复用字符串
否:创建新的字符串,放入hash桶数组中
长字符串:
创建字符串
}
2、相等比较
{
短字符串:直接比较地址
长字符串:地址相等 || (长度相等 && 逐字节比较)
}

四、总结
Lua 中可以保存任何8字节的字符 但是它不以/0为结尾 而是在数据内部用一个长度来表示其字符串所占的内存大小,字符串以引用方式存在,
字符串一旦被创建则不可被改写,字符串属于垃圾回收对象,一旦没有引用,则被销毁
TString中并没有存放字符串的实际数据,只是记录了一些操作字符串的辅助信息,其实真正的字符串数据放在了TString之后的一块内存中, 也就是 一个完整的TString的内存为 sizeof(TString) + shrlen * sizeof(char)
所有的短字符串都存储在全局的global_State,并且全局只有一份,短字符串创建时立即计算hash值,而长字符串惰性计算hash值(也就是需要的时候再计算)。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值