Lua代码
local var = {}
for i = 1, 10000, 1 do
table.insert ( var, i )
end
var[5] = { some = false, another = 2 }
var[888] = @userdata
var[10000] = {}
var[1] = 1
var[1] = false
1)在此之后, var 仍然只有数组部分,或者它也有哈希部分吗?
2)代码
var[10001] = 1
将hash-part添加到 var ,还是只强制表重组而不添加hash-part?
3)它如何影响桌子的大小?
谢谢!
答案 0 :(得分:1)
该表在1和2之后只有一个数组部分。原因是你有一组连续的索引。具体来说,您创建了1到10,001的条目,Lua将为它们分配空间。
例如,如果你创建了1到1000然后添加了10001,它就会在哈希部分中添加最后一个,而不是为所有条目之间创建nil条目。
您输入的数据类型与条目的值无关,Lua只对数组和散列之间的索引感兴趣。这里的例外是将值设置为nil
。这可能会有点复杂,但如果表空间是您主要关注的问题,我不相信Lua会将数组中的哈希部分减少。我可能弄错了。
就尺寸而言,Lua使用倍增策略。因此,在您输入条目8192之后,Lua添加了另一个8192,因此在10000和10001之间没有创建额外的数组空间。
BTW Lua不会重新加入每个表格。当它添加桶时,它会给自己一些空间。我相信它也会在那里加倍。请注意,如果您的数据稀疏,即您不打算填充1和最大值之间的大多数索引,那么即使您的索引是数字,这种散列方法也可以非常有利于空间。主要缺点是它意味着您无法在所有条目中使用ipairs
。