lua 5.3.5 TValue::tt_和GCObject::tt之间的爱恨纠葛

本文深入探讨Lua 5.3.5中TValue::tt_与GCObject::tt的关系。TValue是栈上的Tagged Values,其tt_标识实际类型,包括无需GC和需要GC的类型。GCObject用于需要垃圾回收的对象,其tt标识实际类型但不包含collectable tag。TValue与GCObject的tt_关系是:TValue.tt_ = GCObject.tt | (1<<6)。文章还介绍了TString在TValue与GCUnion间的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文分为两部分:
第一部分,形象地描述TValue::tt_和GCObject::tt的关系;
第二部分,形象地描述各种类型的GCObject(即GCUnion), 并以此叙述一下我对“Lua5.3.5 基本数据类型的设计思路”的想法。

1 TValue::tt_ 和 GCObject::tt

1.1 TValue

Lua官方对TValue的描述为:Tagged Values,意思就是打上了标签(tag)的Value,为什么会这么说呢?

Lua很多操作都是借用了栈,这个栈其实是一个数组(细节见Lua源码的stack_init()函数),如下图所示:
在这里插入图片描述
从图中可以知道,栈里面的每个元素都是一个TValue,其结构代码如下:
在这里插入图片描述
整理一下,可得(好的,这里第一次出现了tt_):
在这里插入图片描述
这里Value是个Union(并列的条状显示),TValue是个struct(层叠的条状显示)。

也就说,不管你是什么类型的数据,当放到栈里面的时候,都是TValue。

因为都是同样的结构体,那么访问栈中的元素时,是需要知道这个TValue里面保存的是哪种类型的值,此时TValue::tt_就派上用场了。

1.1.1 Actual tag

那么tt_的值有哪些呢?
在这里插入图片描述
LUA_TNIL~LUA_TTHREAD 的值为 [0, 8],换成二进制,仅占用4bits。
Lua将tt_的低4位(bit 0-3)的值称之为"actual tag":
在这里插入图片描述
可以分为三类
(1) 空类型,什么都不是,当堆栈中某元素的TValue::tt为0时,可以理解其为堆栈中空闲的元素
(2) 简单类型,和GC无关
(3) 需要GC的类型
其中,“需要GC的类型” 可以理解为:
创造这些数据的时候,使用了malloc/realloc操作。当在栈中处理他们的时候,使用的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值