Lua的Table的内存结构主要分array part和hash part,它们俩的内存大小是动态变化的,如果空间不够就需要分配更多的空间,如果空间利用率太少就需要缩减内存,这个过程叫做rehash。
现在来看看rehash是怎么样的过程。
rehash内部,主要是做了以下几件事:
a.计算array part的key的数量
b.计算hash part的key的数量
c.计算新设的key之后array part部分的数量,
d.计算一个新的array part部分需要分配的内存大小
e.resize。(大概过程如上,后面是每个步骤的细节,如不需要了解,可以跳到最后了。)
static void rehash (lua_State *L, Table *t, const TValue *ek) {
int nasize, na;
int nums[MAXBITS+1]; /* nums[i] = number of keys with 2^(i-1) < k <= 2^i */
int i;
int totaluse;
for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */
nasize = numusearray(t, nums); /* count keys in array part */
totaluse = nasize; /* all those keys are integer keys */
totaluse += numusehash(t, nums, &nasize); /* count keys in hash part