数据结构
下面的结构体是lua中所定义的table
typedef struct Table { CommonHeader; lu_byte flags; /* 1<
设计原理
众所周知,lua的table很强大,可以当数组也可以当哈希表,这得益于其Table结构8的设计与实现。从上面可以看到,array
作数组,node
作哈希表。先讲讲当作数组用时是怎样的。
如果table当作数组用,在需要插入元素的时候,是以数组下标作为key,然后对array
的大小进行取模的。如果下标小于当前数组大小,那么插入成功后所在的位置就跟其下标是一样的。如果下标大于当前数组大小,那么同样也是插入到该数组中,但是此时得分情况讨论了:
- 假设
Node *mainposition (const Table *t, int ktt, const Value *kvl) { switch (withvariant(ktt)) { case LUA_TNUMINT: return hashint(t, ivalueraw(*kvl)); .... }}
如果table当作哈希表用,那么array
的长度一般会相对较小,因为对key
进行哈希后的结果比较分散。所以大都保存在node
中。