Lua 5.x 如何表示稀疏数组?

假设我有一个数组,如下所示:

T = {1,2,[1000] = 3, [-1] = -1}

我知道1和2将在连续的数组部分中,而-1将在哈希部分中。 但是我不知道3在哪里。它将如何在Lua“内部”表示。 在2和3之间会有997个浪费的空间吗?3会为效率而被委派到哈希部分吗?会有2个链接的连续表,一个从索引1开始,第二个从索引1000开始吗?

点赞
用户2726734
用户2726734

这取决于您使用的 Lua 版本。在 Lua 4 中,表严格实现为哈希表。在 Lua 5 中,表是哈希表和数组的一部分,请参见 Lua Implementation,其中第 4 节涵盖了表和稀疏数组

数组部分尝试存储与整数键对应的值从 1 到某个限制 n。对于与非整数键对应或对于超出范围的整数键对应的值将存储在哈希部分中。... 数组部分的计算大小是最大的 n,使得 1 到 n 之间至少有一半的块被使用... 并且 n/2+1n 之间至少有一个插槽被使用。

在您的示例中,1000 可能超出了初始 n,不会导致数组部分增长,因为它太稀疏了。

2014-11-10 12:57:31
用户107090
用户107090

你不需要担心这些细节:只需要相信 Lua 表的实现效率,可以根据给定的键快速访问条目。数组部分只是一种实现细节,通过不需要存储一些键来减少内存使用。

正如 rpattiso 解释的那样,你的示例中没有内存浪费。

2014-11-11 00:39:39