没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
实现实现Lua中数据类型的源码分享中数据类型的源码分享
在Lua中有8种基础类型,像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型
信息。下面我们就来尝试通过Lua 5.2.1的源码来看类型的实现
概述概述
在Lua中有8种基础类型:nil、boolean、number、string、userdata、function、thread和table。可以使用函数type查看某个
变量或值的类型,返回相应的类型名称。像其他动态语言一样,在语言中没有类型定义的语法,每个值都携带了它自身的类型
信息。下面将通过Lua 5.2.1的源码来看类型的实现。
源码实现源码实现
Lua将值表示成带标志的联合结构,代码如下(lobject.h):
90 /*
91 ** Union of all Lua values
92 */
93 typedef union Value Value;
100 /*
101 ** Tagged Values. This is the basic representation of values in Lua,
102 ** an actual value plus a tag with its type.
103 */
104
105 #define TValuefields Value value_; int tt_
400 struct lua_TValue {
401 TValuefields;
402 };
可以看出结构体有两个成员:
一个是整型的tt_用来表示数据类型,Lua中所有的数据类型定义如下(lua.h):
78 #define LUA_TNIL 0
79 #define LUA_TBOOLEAN 1
80 #define LUA_TLIGHTUSERDATA 2
81 #define LUA_TNUMBER 3
82 #define LUA_TSTRING 4
83 #define LUA_TTABLE 5
84 #define LUA_TFUNCTION 6
85 #define LUA_TUSERDATA 7
86 #define LUA_TTHREAD 8
可以看到实现了9种数据类型,其中把语法中userdata分为LUA_TLIGHTUSERDATA和LUA_TUSERDATA,其中前一种类型
即为轻量级userdata(light userdata),轻量级userdata是一种表示C指针的值,对Lua虚拟机来说,这种数据类型不需要
GC(垃圾回收),其指向的内存由用户分配和释放;后一种userdata类型完全userdata(full userdata),内存是由Lua虚拟
机分配,并有GC机制负责处理。
结构体lua_TValue另一个数据成员是value_,它是一个联合体,代码如下(lobject.h):
96 #define numfield lua_Number n; /* numbers */
103 typedef LUA_NUMBER lua_Number;(lua.h)
392 #define LUA_NUMBER double(luaconf.h)
391 union Value {
392 GCObject *gc; /* collectable objects */
393 void *p; /* light userdata */
394 int b; /* booleans */
395 lua_CFunction f; /* light C functions */
396 numfield /* numbers */
397 };
通过注释,可以很容易理解每个成员的含义,但有必要对以下几个成员说明:
numfield:用来表示所有数值,其实质对应的是double类型。包括整型也是用这个来表示。另外在Lua 5.3实现,分开了整
型和浮点数的表示。
GCObject *gc:用来指向那些需要垃圾回收的对象,包括string、table、function、完全userdata和thread类型。GCObject
用来表示可以垃圾回收的对象,它也是一个联合体,其代码如下(lstate.h)
185 union GCObject {
186 GCheader gch; /* common header */
187 union TString ts;
188 union Udata u;
189 union Closure cl;
190 struct Table h;
资源评论
weixin_38570406
- 粉丝: 9
- 资源: 951
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功