lua table長度解析


先來看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導致的。。。









免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM