目录
前言
本文分为两部分:
第一部分,形象地描述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操作。当在栈中处理他们的时候,使用的