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

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

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

情况1.

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

所以

这种t的长度就是5

情况2.

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

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

答案是2,为什么呢?

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

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

然后会进入(lvm.c)

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

然后调用rehash

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

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

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

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

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

lua table长度解析的更多相关文章

  1. lua中求table长度

    关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...

  2. lua中求table长度--(转自有心故我在)

    关于lua table介绍,看以前的文章http://www.cnblogs.com/youxin/p/3672467.html. 官方文档是这么描述#的: 取长度操作符写作一元操作 #. 字符串的长 ...

  3. lua table remove元素的问题

    当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...

  4. Lua table使用

    days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Th ...

  5. C++ Enum 转 Lua Table工具

    C++ Enum转Lua Table工具 观察C++ Enum结构 总结结构 enum GameMessage { //******* ///****************** GM_GAMESER ...

  6. Lua table的remove函数

    [1]remove函数简介 table.remove(table, pos): 返回table数组中位于pos位置的元素,其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元 ...

  7. Lua 学习之基础篇四<Lua table(表)>

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  8. Lua table(表)

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...

  9. lua table integer index 特性

    table.maxn (table) Returns the largest positive numerical index of the given table, or zero if the t ...

随机推荐

  1. ORACLE比较两个数据库的表结构

    create table ESPACE_TABLE( TABLE_NAME VARCHAR2(100) not null) create table ESPACE_COLUMN( TABLE_NAME ...

  2. 在Ubuntu环境下配置NIMH MEG Core Facility之CTF Tools

    在Ubuntu环境下配置NIMH MEG Core Facility之CTF Tools 网站有提示: The install script won't work, but you can copy ...

  3. python super用法

    普通继承 class FooParent(object): def __init__(self): self.parent = 'I\'m the parent.' print 'Parent' de ...

  4. sqlserver锁表、解锁、查看销表

    锁定数据库的一个表 代码如下 复制代码 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 代码如下 复制代码 SELECT * FROM tab ...

  5. jQuery-添加新元素的方法(append()、prepend()、before()、after())

    1.以 HTML 创建新元素 var txt1="<p>Text.</p>"; 2.以 jQuery 创建新元素 var txt2=$("< ...

  6. mybatis-分页和缓存

    1.分页 1.1在dao接口中配置分页参数: package com.java1234.mappers; import java.util.List;import java.util.Map; imp ...

  7. pc-要实现相隔一定时间数据排序变化一次

    有时候产品会有这种要求,就是展示的数据三天是正序的,一天是逆序的,解决是: 以某一个时间点为基准点,然后获取当前的时间,然后计算差值,分情况 //专利 JPView : function(Sorder ...

  8. c++输入

    1. char c = getchar(); 输入单个字符,可输入空格.换行符. 2. cin >> s; 不读取空格或换行符. 3. getline(cin, s); 输入一行到字符串s ...

  9. POJ 2392 Space Elevator(多重背包)

    显然塔的总高度不会超过最大的a[i],而a[i]之前的可以到达的高度 是由a值更小的块组成,所以按照a从小到大的顺序去转移. 然后就是多重背包判断存在性了,几乎和coin那题一样. 数据没coin丧病 ...

  10. PMP(第六版)中的沟通方法总结与对比