lua table 長度解析

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

lua table 長度解析

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

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

第一種例子:

lua table 長度解析

對於這種,初始化了數組長度,t 的長度是 7,為什麼呢。因為最後一位不是 nil

以下情況 t 的長度就是 5。

lua table 長度解析

第二種例子:

lua table 長度解析

大家都應該知道 t 的長度是 5。

lua table 長度解析

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

答案是 2,為什麼呢?

對於 t[6] 的插入,導致 table 表 rehash。

t[6] 會先調用(lapi.c)

lua table 長度解析

然後會進入(lvm.c)

lua table 長度解析

然後會調用(ltable.c)luaH_newkey這個函數

lua table 長度解析

然後調用 rehash

lua table 長度解析

這個地方其實是數組部分和放到hash部分的計算,nums 是統計數字的分佈,仔細看代碼會知道數組長度是 2 的 n 次方。

這兒 nil 不是數字不會納入統計,所以 1,2,5,6 會計算出數組長度是 4,其餘部分放入到 node 部分

lua table 長度解析

table 是有數組和 node hash 部分組成。

這樣根據我們前面看的函數,第四個是 nil,所以用二分法找出的長度是 2。

這樣是 lua 數組裡面如果 nil,可能會導致的坑,當然只是 rehash 導致的。


分享到:


相關文章: