lua TValue类型分析


Lua 中数据的基本结构 下面分析每个结构中各个字段的含义


TValue

Tvalue中的tt 存储了 当前数据的类型,Lua中有8种基础类型:nilbooleannumberstringuserdatafunctionthreadtable。

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 里还需要这个字段呢?
 
 

这个问题可以这样想:

  1. 要从 GCObject 反向得到 TValue 是不行的,假如 GCObject 没有 tt 字段,单单持有 GCObject 的时候,没法判断这个 GCObject 的类型是什么。
  2. GC 在回收对象的时候需要根据类型来释放资源。基于第一点,必须在 GCObject 里加一个表示类型的字段 tt。
链接:http://www.jianshu.com/p/ad30f77bd7d6



猜你喜欢

转载自blog.csdn.net/dingqinghui/article/details/77988335
LUA