首页 > 技术文章 > Lua中Table的实现

xiuxiu55 2020-03-31 15:20 原文

Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组的下标是从1开始的,对于散列表而言,只要其键值补位nil,都可以存储在其中。

首先,考虑 table = {1, 2, 3, 4, 5, 6, 7, 8} 这样的结构, 为了获得最快的访问速度,它是用数组实现的

那么如果执行table[10000] = 10; 莫非要创建10000个元素的数组,没有值的都存为nil,这样的空间利用效率太低无法接受,所有除了数组段之外,table还有一个哈希段,10000这个key会存在哈希段中,当太大的key值导致存储空间利用率低于50%时,这个值会被放进哈希段中。

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 alimit;     /* "limit" of 'array' array */
    TValue *array;         // 数组
    Node *node;            // table的hash表首节点
    Node *lastfree;        // 辅助寻找冲突节点的指针
    struct Table *metatable;  // 元表
    GCObject *gclist;          // table gc相关的参数
} Table;


 

推荐阅读