Lua 取table表長度的底層原理

2021-10-09 03:45:15 字數 657 閱讀 7642

本來想自己寫一下,不小心看到了大佬的一篇文章,非常詳細全面。

偽**概要

if 陣列最後一位 == nil then

則二分查詢往前找到乙個不是nil的返回長度

else

if 陣列最後一位 ~

=nil and 雜湊桶部分 == nil then

return 陣列長度

else

計算雜湊桶部分的長度

local function 計算雜湊桶部分的長度(

) 從陣列長度+

1 開始查詢, 同樣二分查詢 (只針對雜湊桶部分的key為正整數的資料)

end

如果有新增元素,需要考慮重新分配陣列和雜湊桶大小的因素。 重新分配的陣列大小按照50%利用率的原則。

所以,給出的建議是:

(1)盡量不要在乙個表中混用陣列或雜湊桶部分,即乙個表最好只存放一類資料。lua的實現上確實提供了兩者統一表示的遍歷,但是這並不意味著使用者就應該混用這兩種方式。

(2)盡量不要在表中存放nil值,這會讓取長度操作的行為不穩定。

(3)盡量避免重新雜湊操作,因為這個操作的代價極大,通過預分配、只使用陣列部分等策略規避這個lua直譯器背後的動作,能提公升不少效率。

lua的table長度問題

看以下 local tbltest1 print table.getn tbltest1 這段 輸出的結果是3,這個大家都知道,是吧。不管最後那個3後面有沒有加逗號,結果都是3。再看下面的 local tbltest2 print table.getn tbltest2 這段 輸出的結果是多少?這裡...

Lua中table的長度

官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 table t 的長度被定義成乙個整數下標 n 它滿足 t n 不是nil而 t n 1 為nil 此外,如果 t 1 為nil,n 就可能是零。對於常規的陣列,裡面從 1 到 n 放...

lua中求table長度

關於lua table介紹,看以前的文章 官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 tablet的長度被定義成乙個整數下標n。它滿足t n 不是nil而t n 1 為nil 此外,如果t 1 為nil,n就可能是零。對於常規的...