当前位置: 首页 > news >正文

lua table长度解析

先来看lua table源码长度获取部分(ltable.c)

281322454505727.png

j是数组部分的长度。首先判断数组长度大于0,并且数组最后一个是nil,就用二分法查找,返回长度。

如果t->node是 table的hash部分存放,如果是空,就返回数组的长度。


情况1.

281322457943156.png

对于这种,初始化了数组长度,t的长度是7,为什么呢。因为最后一位不是nil

所以

281322475608583.png

这种t的长度就是5


情况2.

281322478253568.png

大家都应该知道 t的长度是5

281322480447268.png

这样的话,t的长度是多少呢???

答案是2,为什么呢?


对于t【6】的插入,导致table表rehash

t[6]会先调用(lapi.c)

281322483884697.png

然后会进入(lvm.c)

281322494037052.png

然后会调用(ltable.c)luaH_newkey这个函数

281322503105610.png

然后调用rehash

281322509663010.png

这个地方其实是数组部分和放到hash部分的计算,nums是统计数字的分布,仔细看代码会知道数组长度是2的n次方。

这儿nil不是数字不会纳入统计,所以1,2,5,6会计算出数组长度是4,其余部分放入到node部分

281322514035708.png

table是有数组 和 node hash部分组成


这样根据我们前面看的函数,第四个是nil,所以用二分法找出的长度是2.

这样是lua数组里面如果nil,可能会导致的坑,当然只是rehash导致的。。。






来自为知笔记(Wiz)


转载于:https://www.cnblogs.com/wallini/p/4188499.html

相关文章:

  • 大话设计模式---装饰模式
  • 利用EntityFramework获得双色球数据库
  • 2732: [HNOI2012]射箭( 半平面交 )
  • 消灭Bug!十款免费移动应用测试框架推荐
  • css引入讲解及media
  • oracle数据类型
  • 使用SQL Server Audit记录数据库变更
  • PHPCMS实现文章置顶功能的方法
  • 关于函数返回值的一些见解
  • Git 的是使用入门
  • Hover States - 有趣的用户界面及交互设计
  • JavaScript Array创建数组
  • C缺陷与陷阱----读书笔记---第一章
  • 利用firefox调试安卓手机端web
  • 笔记:Java面向对象编程 第10章 类的生命周期
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Android交互
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Laravel Telescope:优雅的应用调试工具
  • React-生命周期杂记
  • win10下安装mysql5.7
  • 关于 Cirru Editor 存储格式
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 那些年我们用过的显示性能指标
  • 如何优雅地使用 Sublime Text
  • 在Docker Swarm上部署Apache Storm:第1部分
  • AI算硅基生命吗,为什么?
  • postgresql行列转换函数
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • !!Dom4j 学习笔记
  • #控制台大学课堂点名问题_课堂随机点名
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)共用体union的用法举例
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (ZT)薛涌:谈贫说富
  • (二)JAVA使用POI操作excel
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (九)信息融合方式简介
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (算法二)滑动窗口
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转载)利用webkit抓取动态网页和链接
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET Core跨平台微服务学习资源
  • .net和php怎么连接,php和apache之间如何连接
  • .NET下ASPX编程的几个小问题
  • .NET中的Exception处理(C#)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .skip() 和 .only() 的使用
  • /etc/shadow字段详解