Lua数据结构 — TValue(一)

作者:罗日健

数据结构的设计,在一定程度上奠定了整个系统的设计,所以决定写一个对Lua主要数据结构的分析文章,本来打算写一篇就好了,但是每个数据类型其实都有点复杂,一篇的话篇幅太长,所以就拆开几篇来写了。

为什么是从TValue说起,TValue是实现Lua弱数据类型的主要数据结构,不但在脚本中的值使用了TValue,连Lua的实现中,很多数据结构也依赖于TValue,TValue一定程度上贯穿了整个Lua。先说一下Lua里面的数据类型:(lua.h :69)

从上面的定义中可以看到,Lua的值类型有9种,其中LUA_TNONE是用于判断这个变量是否等于为空使用的,这个是Lua内部使用的,后面再详细说明。现在来看Lua里面的TValue数据结构:(lobject.h 71-75)

在Lua里面,一个变量使用TValue这个类型来存储的,int tt就是上面宏的类型值(4个字节),而Value则是一个union(8个字节)。在这个union中,其实分工也十分明确:

在Value中,void* p、lua_Number n、int b都是不用回收的值类型,而GCObject* gc则都是需要回收的对象,下面是GCObject数据结构:(lstate.h 133-145)

GCObject也是一个union,存储了一个GCheader,这个GCHeader主要用于GC回收机制使用,GC回收机制超出了这次讨论话题,暂时先忽略。真正存储值的结构是TString、Udata、Closure等等,每个存储数据的结构都会有GCheader,接下来几篇文章将会开始逐个数据类型进行解释。

 

时间: 2024-12-23 22:20:08

Lua数据结构 — TValue(一)的相关文章

Lua数据结构 — Udata(五)

作者:罗日健 Udata负责存储userdata的数据,这部分其实很简单,但是为了保证系列文章的完整性,还是写一篇出来补全. 下面是Udata的数据结构: 意义: CommonHeader:和与TValue中的GCHeader能对应起来的部分 metatable:userdata的元表,和table的元表一样的 env:创建userdata时,会把当前执行语句的curenv赋给userdata的env,可修改 len:使用userdata的时候绑定对象申请的空间大小 和TString类似,用户绑

Lua数据结构 — lua_State(六)

作者:罗日健 前面各种Lua的数据类型基本都说得差不多了,剩下最后一个数据类型:lua_State,我们可以认为是"脚本上下文",主要是包括当前脚本环境的运行状态信息,还会有gc相关的信息. Lua这门语言考虑了多线程的情况,在脚本空间中能够开多个线程相关脚本上下文,而大家会共用一个全局脚本状态数据,如下: 全局数据global_state的数据结构如下: global_state主要是用于GC的数据链表,下面简要说明几个: stringtable strt:这个是在TString那章

Lua数据结构 — 闭包(四)

作者:罗日健 前面几篇文章已经说明了Lua里面很常用的几个数据结构,这次要分享的也是常用的数据结构之一 – 函数的结构.函数在Lua里也是一种变量,但是它却很特殊,能存储执行语句和被执行,本章主要描述Lua是怎么实现这种函数的. 在脚本世界里,相信闭包这个词大家也不陌生,闭包是由函数与其相关引用环境组成的实体.可能有点抽象,下面详细说明: 一. 闭包的组成 闭包主要由以下2个元素组成: 函数原型:上图意在表明是一段可执行代码.在Lua中可以是lua_CFunction,也可以是lua自身的虚拟机

Lua数据结构 — Table(三)

作者: 罗日健 前面(一).(二)里面其实已经把一些常用的数据类型(数值.布尔.字符串)说明了,这次要描述的是Table,Table在Lua里是一种常用的数据类型,是Lua里的精髓之一,其效率必须得到保证,而实现这种支持任意类型key和value的Table也是较为复杂的. 一, Table的设计思想: 1, 首先,讲一下Lua要设计的Table是怎么样子的: Lua就是想做这种支持任意类型的key和任意类型val的table,并且要高效和节约内存. 2, 基本的实现(基于链表的实现): 基于链

Lua数据结构 — TString(二)

作者:罗日健 存储lua里面的字符串的TString数据结构:(lobject.h 196-207) 其它结构中也会有L_Umaxalign dummy这个东西,来看看L_Umaxaliagn: 从字面意思上就是保证内存能与最大长度的类型进行对齐,事实上也是做这件事,这里感觉lua想给各种不同设备做一种嵌入式脚本,这里要保证与最大的长度对齐能保证CPU运行高效不会罢工. tsv才是TString的主要数据结构: CommonHeader:这个是和GCObject能对应起来的GCheader re

Lua之Lua数据结构-TTLSA(6)(转) good

一. tabletable是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构如array.list等等,lua都是通过table来实现的.table非常实用,可以用在不同的情景下.最常用的方式就是把table当成其他语言的数组.实例1:   1 2 3 4 mytable = {} for index = 1, 100 do     mytable[index] = mat

Lua数据结构的学习笔记

一. table table是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构如array.list等等,lua都是通过table来实现的.table非常实用,可以用在不同的情景下.最常用的方式就是把table当成其他语言的数组. 实例1:  代码如下 复制代码 mytable = {} for index = 1, 100 do     mytable[index] =

Lua学习笔记之数据结构_Lua

最近研究Lua,顺便写点笔记吧!数据结构是没有语言之分的,只不过不同的语言实现起来的语法不同,既然是Lua菜鸟,就来实现几个常用的数据结构来练练语法吧!首先是作为数据结构基石的数组,在Lua中数组是用表来实现的,表是个强大的东西,能表示太多东西了,当表中元素的下标都是整数的时候,我们把这个表称作数组.数组的大小不固定,可以动态的增长. 复制代码 代码如下: --创建一个简单的数组 local arr1 = {1,2,3,4,5,6} --遍历数组中得每一个元素 for i,v in ipairs

Lua中使用table实现的其它5种数据结构_Lua

lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础,如:数组,记录,链表,队列等都可以用它来表示. 1.数组 在lua中,table的索引可以有很多种表示方式.如果用整数来表示table的索引,即可用table来实现数组,在lua中索引通常都会从1开始. 复制代码 代码如下: --二维数组 n=10 m=10 arr={} for i=1,n do      arr[i]={}    for j=1,m do       arr[i][j]=i*j    end end f