一篇文章讲明白luauserdata

简介: 一篇文章讲明白luauserdata

本文内容基于版本:Lua 5.3.0

概述

Userdata在储存形式上和字符串十分类似,也是在代表该数据类型的结构体Udata后面直接追加数据内容部分。Userdata可以看成是拥有独立元表,没有内部化处理,也不需要追加'\0'字符的字符串 。从底层来看,Userdata和字符串存储的都是二进制数据,因此它们必然有一定的共同性,而由于两者用途不同又展现出一定的差异性。阅读Lua源码可以看到Userdata和字符串的实现代码被放在一起, 两者的API也以luaS打头。

Udata结构

? Udata结构的声明

Lua中Userdata对应的C结构为Udata,该类型定义在lobject.h中。

// lobject.h

/

Common Header for all collectable objects (in macro form, to be

included in other objects)

/

#define CommonHeader GCObject next; lu_byte tt; lu_byte marked

// lobject.h

/

Header for userdata; memory area follows the end of this structure

(aligned according to 'UUdata'; see next).

/

typedef struct Udata {

CommonHeader;

lubyte ttuv; / user value's tag /

struct Table metatable;

sizet len; / number of bytes /

union Value user; / user value /

} Udata;

CommonHeader : 用于GC的信息。

ttuv :

metatable : Userdata关联的元表。

len :

user :

? Udata存储结构图

Lua中Userdata数据内容部分并未分配独立的内存来存储,而是直接追加在Udata结构的后面。Udata存储结构如下图:

? Userdata对象 = Udata结构 + 实际用户数据

? Udata结构 = GCObject 指针 + Userdata信息数据

创建Userdata

? Userdata创建的函数调用图

Userdata创建过程的核心函数是luaS_newudata,而函数lua_newuserdata作为luaS_newudata的包裹函数旨在屏蔽Udata的内部细节,而只提供给用户指向存储实际数据部分的内存指针。下面就这两个函数着重进行分析。

? luaS_newudata

// lstring.h

#define sizeludata(l) (sizeof(union UUdata) + (l))

// lstring.h

LUAI_FUNC Udata luaS_newudata (lua_State L, size_t s);

// lstring.c

Udata luaS_newudata (lua_State L, size_t s) {

Udata u;

GCObject *o;

if (s > MAX_SIZE - sizeof(Udata))

luaM_toobig(L);

o = luaC_newobj(L, LUA_TUSERDATA, sizeludata(s));

u = gco2u(o);

u->len = s;

u->metatable = NULL;

setuservalue(L, u, luaO_nilobject);

return u;

}//代码效果参考:http://www.ezhiqi.com/bx/art_6973.html

相关文章
lua字符串与十六进制数据转换
lua字符串与十六进制数据转换
744 2
|
C++
UE4/5中DataTable数据表的使用
UE4/5中DataTable数据表的使用
1990 1
UE4/5中DataTable数据表的使用
|
7月前
|
存储 人工智能 Shell
Lua与C语言接口编程实战指南:打造高性能、灵活的程序
本文深入介绍了 Lua 与 C 语言的交互机制,重点分析了 Lua 作为胶水语言在嵌入式系统、游戏开发(如 Skynet、OpenResty)中的应用。内容涵盖 Lua 环境搭建、虚拟栈管理、C 与 Lua 的相互调用、闭包、Userdata 和注册表的使用等核心技术,并结合代码示例讲解了如何在实际项目中实现 Lua 与 C 的高效交互,适合希望掌握 Lua 扩展与嵌入开发的工程师参考学习。
921 0
|
11月前
|
设计模式 前端开发 Java
深入理解 PRG 模式(Post/Redirect/Get)
本文深入解析了 PRG 模式(Post/Redirect/Get)在 Web 开发中的应用。PRG 模式通过“提交表单(POST)→ 重定向(Redirect)→ 获取页面(GET)”的流程,有效避免了重复提交问题,提升了用户体验并符合 HTTP 标准。文章详细阐述了其工作原理、优缺点,并结合 Spring MVC 提供实现示例。尽管存在多一次请求等不足,PRG 模式仍是构建稳定 Web 应用的核心实践。
912 1
|
JavaScript 前端开发 编译器
还不会ts?一文带你打开ts的大门
该文章详细介绍了TypeScript的基础知识,包括类型系统、类、接口、泛型等核心概念,并通过具体示例展示了如何使用TypeScript进行项目初始化和模块化开发,帮助读者快速掌握TypeScript的基本用法。
1251 133
还不会ts?一文带你打开ts的大门
|
安全 图形学
【unity实战】事件(Event)的基本实战使用
【unity实战】事件(Event)的基本实战使用
1153 1
|
编解码 前端开发 Java
【推荐100个unity插件之12】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
【推荐100个unity插件之12】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
2429 0
|
vr&ar 图形学 UED
优化图形渲染与物理模拟:减少Draw Calls与利用LOD技术提升性能
【7月更文第10天】在现代游戏开发和实时渲染应用中,性能优化是至关重要的环节,它直接关系到用户体验的流畅度和真实感。本文将深入探讨两种关键技术手段——减少Draw Calls和使用Level of Detail (LOD) 技术,来提升图形渲染与物理模拟的效率。
1052 2
|
机器学习/深度学习 编解码 人工智能
什么样才算好图——从生图模型质量度量方法看模型能力的发展(下)
什么样才算好图——从生图模型质量度量方法看模型能力的发展(下)
1170 1