一、概述
string是Lua的一种数据类型,它不同于普通的基本类型,为了节约内存,多个相同的短字符串会共用一个,因而需要管理string的引用情况,从而实现在不被用时,能正确GC。
二、实现细节
1、字符串分类
Lua为了节省内存,Lua的字符串分为短字符串和长字符串。
短字符串: 长度小于等于40为短字符串。相同字符的短字符串是共用同一个的。
长字符串: 长度大于40为长字符串。相同的两个长字符串是两个独立的字符串。
2、string数据类型定义
string在Lua运行时里的数据结构是TString。具体的定义如下。
如上图,TString可以认为是一个GCObject的派生类(实际不是,只是有GCObject相同的数据成员),TString既用来表示短字符串也用来表示长字符串。主要记录了string的hash值,长度,如果是短字符串,还包含了指向hash表里下一个短字符串的指针。
3、短字符串管理
- 存储结构
所有的短字符串sringtable来管理,存储在global_state里,字段名为strt,所有的短字符串用了一个hash表来管理,作为strt的一个成员,名