Lua 中数据的基本结构 下面分析每个结构中各个字段的含义
TValue
Tvalue中的tt 存储了 当前数据的类型,在Lua中有8种基础类型:nil、boolean、number、string、userdata、function、thread和table。
Value 为实际存储的值
Value
p:为c中传入的指针,由c 分配和释放
b:存贮bool值 注意这里是用int存储 而不是bool
f:存贮从c中注册到lua中的c函数 typedef int (*lua_CFunction) (lua_State *L);
n:所有的数值类型 lua5.3 将double 和 int 分开存储新加了一个lua_Integer i 字段
GCObject
gch:用于垃圾回收 主要是为了连接垃圾回收对象的互相引用关系
#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked
next穿链表 tt类型 marked用于垃圾回收的表示
真正存储数据的是TString 等
TString
{
CommonHeader;
.....
}
可以看出来每个垃圾回收对象都有一个CommonHeader ,其实在C中结构体里包含一个其他类型的值 就是相当于模拟C++继承某个类型 可以看到每个垃圾回收类型都继承了
CommonHeader, CommonHeader 是为了垃圾回收时使用
userdata :用户再lua中定义的数据(只是分配内存,并不是定义新的数据类型)
lua_State : 类似于thread 运行期间包含的相关数据(堆栈、环境等等)
Lua的内存表示:
TValue 里不是已经有一个 tt_ 字段用于表示类型了吗?为什么在 GCObject 里还需要这个字段呢?
这个问题可以这样想:
- 要从 GCObject 反向得到 TValue 是不行的,假如 GCObject 没有 tt 字段,单单持有 GCObject 的时候,没法判断这个 GCObject 的类型是什么。
- GC 在回收对象的时候需要根据类型来释放资源。基于第一点,必须在 GCObject 里加一个表示类型的字段 tt。
链接:http://www.jianshu.com/p/ad30f77bd7d6
|
请发表评论