Lua数据结构 — Udata(五)

作者:罗日健

Udata负责存储userdata的数据,这部分其实很简单,但是为了保证系列文章的完整性,还是写一篇出来补全。

下面是Udata的数据结构:


意义:

  1. CommonHeader:和与TValue中的GCHeader能对应起来的部分
  2. metatable:userdata的元表,和table的元表一样的
  3. env:创建userdata时,会把当前执行语句的curenv赋给userdata的env,可修改
  4. len:使用userdata的时候绑定对象申请的空间大小

和TString类似,用户绑定的C对象或数据内存紧跟在Udata后面,在luaS_newudata中(lstring.c 96 – 110)有如下代码:


 

Udata元表(metable)的作用:

如果userdata没有元表,那是使用起来将会很麻烦,有元表,可以在脚本这样写:


从C语言层面来看,myuserdata这个变量其实只是个指针,不像table那样有子元素。但是因为有metatable,由此可以把成员\函数放到这个metatable中,在脚本中可以利用它来实现这个类似table的访问方法。

 

Udata环境(env)的作用:

env这个成员,默认是存储创建userdata时的环境table,而参考Lua官方的文档后,其实这个env成员在Lua中并没有使用,它的值时什么并不影响Lua的运行。

这就说明这个成员目前来说是一个用户可以自由操作的table,在UserDataRefinement文章中,告诉了我们一些使用的手段。另外一篇文章http://lua-users.org/lists/lua-l/2005-08/msg00709.html也对它的使用方法提出了一些建议。

我比较赞成后一篇文章的看法,对于Udata来说,metatable是一种静态的类型数据(type-common data),而env则是实例相关的数据(instance-local data)。当然了,怎么用取决于使用者。

 

时间: 2024-07-28 21:28:05

Lua数据结构 — Udata(五)的相关文章

Lua数据结构 — 闭包(四)

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

Lua数据结构 — TValue(一)

作者:罗日健 数据结构的设计,在一定程度上奠定了整个系统的设计,所以决定写一个对Lua主要数据结构的分析文章,本来打算写一篇就好了,但是每个数据类型其实都有点复杂,一篇的话篇幅太长,所以就拆开几篇来写了. 为什么是从TValue说起,TValue是实现Lua弱数据类型的主要数据结构,不但在脚本中的值使用了TValue,连Lua的实现中,很多数据结构也依赖于TValue,TValue一定程度上贯穿了整个Lua.先说一下Lua里面的数据类型:(lua.h :69) 从上面的定义中可以看到,Lua的值

Lua数据结构 — lua_State(六)

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

Lua数据结构 — TString(二)

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

Lua数据结构 — Table(三)

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

JavaScript中数据结构与算法(五):经典KMP算法

  这篇文章主要介绍了JavaScript中数据结构与算法(五):经典KMP算法,本文详解了KMP算法的方方面在,需要的朋友可以参考下 KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上

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] =

数据结构教程 第五课 线性表的类型定义

教学目的: 掌握线性表的概念和类型定义 教学重点: 线性表的类型定义 教学难点: 线性表的类型定义 授课内容: 复习:数据结构的种类 线性结构的特点: 在数据元素的非空有限集中, (1)存在唯一的一个被称做"第一个"的数据元素: (2)存在唯一的一个被称做"最后一个"的数据元素: (3)除第一个之外,集合中的每个数据元素均只有一个前驱: (4)除最后一个之外,集合中每个数据元素均只有一个后继. 一.线性表的定义 线性表是最常用且最简单的一种数据结构. 一个线性表是n