lua table長度解析

先來看lua table源碼長度獲取部分(ltable.c)node


j是數組部分的長度。首先判斷數組長度大於0,而且數組最後一個是nil,就用二分法查找,返回長度。api

若是t->node是 table的hash部分存放,若是是空,就返回數組的長度。數組


狀況1.函數


對於這種,初始化了數組長度,t的長度是7,爲何呢。由於最後一位不是nillua

因此3d


這種t的長度就是5blog


狀況2.get


你們都應該知道 t的長度是5源碼


這樣的話,t的長度是多少呢???hash

答案是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致使的。。。






相關文章
相關標籤/搜索