• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

lua TValue类型分析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


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




鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
quick-cocos2d-x开发环境Lua for IntelliJ IDEA的安装发布时间:2022-07-22
下一篇:
安装nginx+lua开发环境发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap