加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

关于lua table的实现

发布时间:2020-12-14 22:16:10 所属栏目:大数据 来源:网络整理
导读:? ? 以下内容只作本人学习笔记,内容会随着我对lua源码分析的深入慢慢修改,所以以下内容只作参考,并非100%正确。 ??? 脚本table中的元素在c中是分两个地方存放的,即数组与hash表。table中元素的位置也不是一直固定的,它会根据table被修改的情况动态改变

? ? 以下内容只作本人学习笔记,内容会随着我对lua源码分析的深入慢慢修改,所以以下内容只作参考,并非100%正确。

??? 脚本table中的元素在c中是分两个地方存放的,即数组与hash表。table中元素的位置也不是一直固定的,它会根据table被修改的情况动态改变。下面分两种情况说一下table的特点。

??? 第一,先来看构造table时lua是怎么处理的。

? ? 如果构造table的时候指定了key的值,不管key是何值,也会将key进行hash。比如:

t1 = 
{
  [1] = 100,[2] = 200,[3] = 300,}

? ? 只有构造table时不指定key值,这些value才会放在数组段。比如:

t2 = {100,200,300}


???所以, 用这两种不同的构造方式构造的table的访问效率是不一样的。不过实际应用中,像这样手动构造的table一般不会很大,所以遍历的的消耗也不会相差太远。

??? 第二,来看一下对table的修改会产生什么样的行为。

??? 如果向table插入一个以字符串,table,userdata,函数,0或负数为key的值时,都会将key进行hash,然后将其放到hash表中。

??? 如果向table插入一个以正整数为key的值时,如果key的值大于2的26次方,那也会将其放入hash表中,否则,lua会用一个算法来判断这个key在数组中的位置是否过于离散,如果是,则将其放入hash表中,否则将其放入数组段中。

??? 上面只是说了个大概,还有很多细节没有说到,比如在插入前会先判断是否有空位,有就直接插入,没有就会对数组和hash表进行调整后再插入。

??? 继续分析。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读