这段代码会向 Lua 类似数组的表中添加哈希部分吗?

1)这之后,var 还只是数组部分,还是它已经有了哈希部分?

2)代码

var[10001] = 1

是将哈希部分加入 var,还是只是强制重新哈希表而不添加哈希部分?

3)这对表的大小有什么影响?

谢谢!

点赞
用户2279620
用户2279620

表在 1 和 2 都出现后只有一个数组部分。原因是你有一组连续的索引。具体而言,你从 1 到 10,001 创建了条目,Lua 将为它们分配空间。

例如,如果你创建了 1 到 1000,然后添加了 10001,它会将最后一个添加到哈希部分,而不是为所有条目之间创建 nil 条目。

无论你将什么类型的数据放入作为条目值,Lua 只关心索引在决定数组和哈希之间。这里的例外是将值设置为 nil。这可能有点复杂,但如果表空间是你的主要关注点,我不认为 Lua 会在你将它们设置为空时减少数组和哈希部分。我可能会在这方面弄错。

至于大小,Lua 使用加倍策略。因此,在第 8192 个条目之后,Lua 添加了另外 8192 个条目,以便在 10000 和 10001 之间没有额外的数组空间被创建。

顺便说一下,Lua 不会对每个表添加重新哈希。当它添加桶时,它会为自己留出一些余地。我相信它在这里也会加倍。请注意,如果你的数据是稀疏的,即你不会填满 1 和你的最大值之间的大多数索引,则哈希的这种方法即使你的索引是数字也可以节省很多空间。主要的缺点是这意味着你不能在所有条目上使用 ipairs

2014-08-04 13:55:34