博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua table长度解析
阅读量:5011 次
发布时间:2019-06-12

本文共 582 字,大约阅读时间需要 1 分钟。

先来看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导致的。。。

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

你可能感兴趣的文章
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>
Android Gson深入分析
查看>>
display:flow-root
查看>>
判读字符串是否为空的全局宏-分享
查看>>
iOS中Block的基础用法
查看>>
mac 终端 使用ftp命令
查看>>
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
HDOJ 5630 Rikka with Chess
查看>>
netcore2.1 在后台运行一个任务
查看>>
PostgreSQL pg_hba.conf 文件简析
查看>>
android o logcat read: unexpected EOF!
查看>>
[Scrum]2010/12/28 —— 第一天!
查看>>
ASP.NET MVC模式 温习(一)排除MVC模式误区
查看>>
Mysql的read_only 只读属性说明 (运维笔记)
查看>>
DOCKER 从入门到放弃(五)
查看>>