lua 中关于table的一些源码笔记

lua中关于table的定义:

typedef struct Table {
  CommonHeader;
  lu_byte flags;  /* 1<<p means tagmethod(p) is not present */
  lu_byte lsizenode;  /* log2 of size of 'node' array */
  unsigned int sizearray;  /* size of 'array' array */
  TValue *array;  /* array part */
  Node *node;
  Node *lastfree;  /* any free position is before this position */
  struct Table *metatable;
  GCObject *gclist;
} Table;

从结构体中可以看出table中 key,value的存放有2种形式:

  array:根据key从0开始依次存放。(当key值超过最大范围时,则放入node中)

  node:计算key的hash,然后找到对应位置存放,如果hash相同,应该是根绝桶计算原则存放,node中有个下一node偏移访问。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在lua5.3版本中调试了下源代码,发现了一个现象:

t = {
    [1] = 10,
    [2] = 20,
}

-- 此时table中的元素都放在node中,因为table默认初始时sizearray为0,插入时没有重新计算数组大小


t[3] = 30
-- 运行完这句话时,数据中元素也全放在node中,没有重新计算数组大小


table.insert(t, 40)
-- 运行完这句时,数据中元素会全部移到到size中

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

连续内存的优点就是插入,读取的时候速度会快些,从中间删除会慢,涉及到内存移动。

如果数组中本来是在array中的,因为初始话没有放入,后面重新计算扩容数组大小的时候,也涉及到内存从node到array的拷贝。

关于table,写到这里,之前一直没关注过lua底层的实现原则,只知道有2中形式的存放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值