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值(也就是需要的时候再计算)。

你可能感兴趣的:(Lua源码分析,Lua)