void luaS_resize (lua_State *L, int newsize) {
int i;
stringtable *tb = &G(L)->strt;
/* cannot resize while GC is traversing strings */
luaC_runtilstate(L, ~bitmask(GCSsweepstring));
if (newsize > tb->size) {
luaM_reallocvector(L, tb->hash, tb->size, newsize, GCObject *);
for (i = tb->size; i < newsize; i++) tb->hash[i] = NULL;
}
/* rehash */
for (i=0; i<tb->size; i++) {
GCObject *p = tb->hash[i];
tb->hash[i] = NULL;
while (p) { /* for each node in the list */
GCObject *next = gch(p)->next; /* save next */
unsigned int h = lmod(gco2ts(p)->hash, newsize); /* new position */
gch(p)->next = tb->hash[h]; /* chain it */
tb->hash[h] = p;
resetoldbit(p); /* see MOVE OLD rule */
p = next;
}
}
if (newsize < tb->size) {
/* shrinking slice must be empty */
lua_assert(tb->hash[newsize] == NULL && tb->hash[tb->size - 1] == NULL);
luaM_reallocvector(L, tb->hash, tb->size, newsize, GCObject *);
}
tb->size = newsize;
}
当桌子长大时,它会重新整理。但是,当表收缩时,它只是以一半大小重新分配而无需重新哈希。我听不懂如何运作?
最佳答案
好。我自己回答这个问题。该代码运行良好,因为重新哈希操作不在第一个if(newsize> tb-> size)中。它适用于(newsize> tb-> size)和(newsize size)。下次,我将更仔细地阅读代码。
关于c - lua 5.2.3源lstring.c函数luaS_resize,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30759159/