Lua源码中Table的实现主要包括以下几点:
数据结构:
数组部分:存储在TValue *array中,长度信息存储在int sizearray。哈希表部分:存储在Node *node中,哈希表的大小用lu_bytelsizenode表示,且大小为2的整数次幂。
内存管理:
一个全局变量dummynode用于初始化空表。创建table时,使用setnodevector函数初始化哈希表部分,内存管理通过luaM API进行。销毁table时,无需特殊操作,只需将对应键的值设置为nil,等待垃圾回收。
操作:
插入操作:首先尝试在数组部分查找,若失败则尝试哈希表。哈希碰撞时,冲突元素会移动以腾出空间,然后将新元素插入哈希表。查询操作:分为数组内查找和哈希表查找,冲突键值对通过Node的next域单向链接。迭代操作:使用ipairs和pairs函数,通过state和index变量进行访问。获取长度操作:只对序列表有效,使用二分法快速定位非空整数键位置。
优化建议:
避免触发rehash:直接修改已存在键值对的值可避免rehash。遍历与插入:遍历过程中向table插入新键将影响后续遍历行为,但修改已存在键值对是允许的。删除元素:等同于赋值为nil,等待垃圾回收,但不会触发rehash操作。预分配大小:构造数组时预分配大小可减少rehash操作。使用长度操作符#:数组不应包含nil值,以防出错。
这些实现细节和优化建议共同构成了Lua中高效且灵活的table数据结构。