lua 中关于table的一些源码笔记

lua中关于table的定义:

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

从结构体中可以看出table中 key,value的存放有2种形式:

  array:根据key从0开始依次存放。(当key值超过最大范围时,则放入node中)

  node:计算key的hash,然后找到对应位置存放,如果hash相同,应该是根绝桶计算原则存放,node中有个下一node偏移访问。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在lua5.3版本中调试了下源代码,发现了一个现象:

t = {
    [1] = 10,
    [2] = 20,
}

-- 此时table中的元素都放在node中,因为table默认初始时sizearray为0,插入时没有重新计算数组大小


t[3] = 30
-- 运行完这句话时,数据中元素也全放在node中,没有重新计算数组大小


table.insert(t, 40)
-- 运行完这句时,数据中元素会全部移到到size中

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

连续内存的优点就是插入,读取的时候速度会快些,从中间删除会慢,涉及到内存移动。

如果数组中本来是在array中的,因为初始话没有放入,后面重新计算扩容数组大小的时候,也涉及到内存从node到array的拷贝。

关于table,写到这里,之前一直没关注过lua底层的实现原则,只知道有2中形式的存放。

猜你喜欢

转载自blog.csdn.net/insaneNx/article/details/82494148