*/#defineLUA_TNONE (-1)#defineLUA_TNIL 0#defineLUA_TBOOLEAN 1#defineLUA_TLIGHTUSERDATA 2#defineLUA_TNUMBER 3#defineLUA_TSTRING 4#defineLUA_TTABLE 5#defineLUA_TFUNCTION 6#defineLUA_TUSERDATA 7#defineLUA_TTHREAD 8 tables的实现被分成了两个部分: 核心由ltable.c完成,提供了table的基本存取方...
#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1))) 乍一看很复杂,其实就是对lsizenode2次幂减1取模(最后按位或1,是为了保持要用来取模的数字是不为0,是大于等于1的数)。 hashint的流程还是用上面Node[8]为例子进行实际讲解,假如我们已确定Table的哈希部分长度为8,数组部分先不考虑...
colo字段表示colocation数组的长度,这个数组就是table的数组部分,如果它比较小,就会在table创建时,和table本身分配在一起,这也是考虑到了程序的局部性,colocation数组最大的长度为16。 // lj_def.h#define LJ_MAX_COLOSIZE 16/* Max. elems for colocated array. */ 后面几个字段都比较好理解了,array指向table...
*/#define TValuefields Value value_;lu_byte tt_ typedef struct TValue{TValuefields;}TValue; Value中包含各种实际类型需要用到的变量,其中GCobject用于存储需要被gc类型的地址,目前string, userdata, table, function, thread是需要gc的类型,其他几个字段分别用于存储lightuserdata指针,c导出的函数地址,整数,浮...
#define LUA_TLIGHTUSERDATA 2 #define LUA_TNUMBER 3 #define LUA_TSTRING 4 #define LUA_TTABLE 5 #define LUA_TFUNCTION 6 #define LUA_TUSERDATA 7 #define LUA_TTHREAD 8 数据对象由lua_TValue表示,分为两部分。 int tt_表示对象的类型;Value value_为具体值。
#definettisnil(o)checktag((o),LUA_TNIL) 无 boolean(布尔)type(true)-->boolean#defineLUA_TBOOLEAN1 不被GC管理 // 判断TValue* o是否为一个bool值 即:o->_tt是否为1 #definettisboolean(o)checktag((o),LUA_TBOOLEAN) int number(数值) ...
#define TValuefields Value value; int tt Value: typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; Node *node 是指向该表的散列桶数组起始位置的指针 3.2 Node类型 每个Node都是一个键值对,里面包含了key和value。tvk是key的值,但是当我们出现hash冲突,此时lua的hash算法比较特...
#define hashstr(t,str) hashpow2(t, (str)->tsv.hash) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 当key为其他类型时,则统一调用mainposition获取其hash值对应的散列地址。我们来看看mainposition支持哪些类型。 static Node *mainposition (const Table *t, const TValue *key) {...
table在里面数据方式比较直观,但是算法很复杂。一些算法的坑会慢慢补上。 先总括下table的数据结构: 1)由一个hash表和一个数组构成,当插入一个小标元素,会根据当前数组的大小决定插入哪儿 2)hash表上会有冲突,通过一个链表的形式组织冲突的元素 3)通过源码,我们还能得到的是一些table的使用技巧方式,尤其是在大数据...
#define lua\_register(L,n,f) \\ (lua\_pushcfunction(L, f), lua\_setglobal(L, n)) lua_remove# [-1, +0, –] void lua_remove (lua_State *L, int index); 从给定有效索引处移除一个元素, 把这个索引之上的所有元素移下来填补上这个空隙。 不能用伪索引来调用这个函数,因为伪索引并不...