数据结构
lua中的table可以表示所有的数据结构 ,诸如字典 ,数组,或者对象都可以使用table来实现
table的数据结构如下图

flags::位标识,用于表示这个表中提供了哪些元方法 最开 始这个flags 的,也就是 ,当查找一次之后,如果该表中存在某个元方法,那么将该元方法对应的flag bit置为 1,1这样下一次查找时只需要比较这个bit 就行了 每个元方法对应的bit定义在 ltm.h文件中
array: Table的数组部分
sizearray: 数组部分的大小
node: 指向哈希表数组的起始位置
lastfree:指向哈希表数组的结束位置
lsizenode:哈希表长度以2为底的对数
metatable : 元表指针
gclist :GC相关的链表
从上图可以看出 除了用于gc的CommonHeader 和 gclist除外,table主要由TValue类型的数组 和 Node类型的哈希表 组成,
下面是表中结点的数据类型。从一个Node结点中包含一个key 和 value,vlaue就是通用数据类型 ,而key是一个Union类型,一般情况下,union结构是用来以一种比较省内存的方式来表示多种类型的,在某个时刻该数据类型只会是其中的一个类型,这种数据结构在Lua中很常见 ,而next是用于标识下一个结点Node的位置,它是一个相对于当前结点位置的偏移量


下图是一个表的数据结构示意图 :

由上图可以看出 lua的表分为数组和散列表两部分,其中数组部分以1作为第一个索引,用于存储部分 key为整数的Node,对于不能放在数组部分的node,将其存

本文介绍了Lua5.3中table数据结构的内部实现,包括flags、array、node等组成部分,以及table的初始化、插入、迭代和#操作的工作原理。在插入部分,详细阐述了闭散列和单向链表解决冲突的方法,同时讨论了如何决定key存入数组还是哈希表。#操作则解释了其寻找连续nil的特性,提醒开发者注意使用场景。
最低0.47元/天 解锁文章
561

被折叠的 条评论
为什么被折叠?



