关于lua table实现的一个问题
脚本table中的元素在c中是分两个地方存放的,即数组与hash表。之前看了一些文章提到,如果key是数字的话,一般放在数组段,如果数字key非常离散,那就会对数字进行hash,然后再存到hash表中。但最近看了lua5.1的源码后发现不是这样的。
如果一个table已经构造好,这时修改table的内容,不管key是何值,都会将key进行hash。
如果构造table的时候指定了key的值,不管key是何值,也会将key进行hash。比如:
t1 = { [1] = 100, [2] = 200, [3] = 300, }
只有构造table时不指定key值,这些value才会放在数组段。比如:
t2 = {100, 200, 300}
所以, 用这两种不同的构造方式构造的table的访问效率是不一样的。不过实际应用中,像这样手动构造的table一般不会很大,所以遍历的的消耗也不会相差太远。
回到文章头,估计之前看的是5.1版本之前的实现,但感觉其实这样做不是更好吗?为什么5.1要改了呢?或者在table的生存期间还会动态调整各个value的位置吧。继续分析。