Lua5.3源码阅读记录(4) -- 表

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

  数据结构

 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,将其存

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值