lua中关于table的定义:
typedef struct Table {
CommonHeader;
lu_byte flags; /* 1<<p means tagmethod(p) is not present */
lu_byte lsizenode; /* log2 of size of 'node' array */
unsigned int sizearray; /* size of 'array' array */
TValue *array; /* array part */
Node *node;
Node *lastfree; /* any free position is before this position */
struct Table *metatable;
GCObject *gclist;
} Table;
从结构体中可以看出table中 key,value的存放有2种形式:
array:根据key从0开始依次存放。(当key值超过最大范围时,则放入node中)
node:计算key的hash,然后找到对应位置存放,如果hash相同,应该是根绝桶计算原则存放,node中有个下一node偏移访问。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在lua5.3版本中调试了下源代码,发现了一个现象:
t = {
[1] = 10,
[2] = 20,
}
-- 此时table中的元素都放在node中,因为table默认初始时sizearray为0,插入时没有重新计算数组大小
t[3] = 30
-- 运行完这句话时,数据中元素也全放在node中,没有重新计算数组大小
table.insert(t, 40)
-- 运行完这句时,数据中元素会全部移到到size中
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
连续内存的优点就是插入,读取的时候速度会快些,从中间删除会慢,涉及到内存移动。
如果数组中本来是在array中的,因为初始话没有放入,后面重新计算扩容数组大小的时候,也涉及到内存从node到array的拷贝。
关于table,写到这里,之前一直没关注过lua底层的实现原则,只知道有2中形式的存放。