Lua表

这篇博客详细介绍了Lua中的表数据结构,包括其数组加哈希表的组成方式,以及如何创建新表和存入整数键的值。在哈希表中,当查找键时会首先考虑数组部分,若未找到则会在哈希表中进行查找或插入。表的扩展策略是根据整数键的数量来调整,确保数组部分的利用率至少达到50%。整个过程旨在优化查找效率和内存使用。
摘要由CSDN通过智能技术生成

Lua表

表的数据结构:数组+哈希表(链地址法)

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;  /* array part */
  Node *node;
  Node *lastfree;  /* any free position is before this position */
  struct Table *metatable;      /* 原表 */
  GCObject *gclist;
} Table;

哈希表节点数据结构

typedef union Node {
   
  struct NodeKey {
   
    TValuefields;  /* fields for value */
    lu_byte key_tt;  /* key type */
    int next;  /* for chaining */
    Value key_val;  /* key value */
  } u;
  TValue i_val;  /* direct access to node's value as a proper 'TValue' */
} Node;

创建新表

Table *luaH_new (lua_State *L) {
   
  GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table));
  Table *t = gco2t(o);
  t->metatable = NULL;
  t->flags = cast_byte(maskflags);  /* table has no metamethod fields */
  t->array = NULL;
  t->alimit = 0;
  setnodevector(L, t, 0);
  return t;
}

存入一个整数键的值:查找表中是否有该值(数组和哈希表两部分), 如果key不大于数组的大小,则直接取对应下标的数组地址。 否则,如果’alimit’不等于数组的实际大小,且key不大于数组实际大小,返回对应下标的数组地址。 在这种情况下,请尝试避免在key仅比限制多一个时调用“ luaH_realasize”(以便可以在不更改数组实际大小的情况下对其进行扩展;如果没有找到,就往哈希表里面查找。

void luaH_setint (lua_State *L, Table 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值