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/

10-11 16:35