• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Lua设计与实现:字符串的实现-strt散列数组的重新散列—luaS_resize ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

详细如图所示

void luaS_resize (lua_State *L, int newsize) {
  GCObject **newhash; // newhash 为一个数组,里面存放的是GCObject*的类型数据
  stringtable *tb;    //获取在lua_State环境中维护的stringTable散列数组
  int i;
  if (G(L)->gcstate == GCSsweepstring)
    return;  /* cannot resize during GC traverse */
  newhash = luaM_newvector(L, newsize, GCObject *); //重新分配一个内存空间
  tb = &G(L)->strt;   //获取
  for (i=0; i<newsize; i++) newhash[i] = NULL;  //进行初始化
  /* rehash */
  for (i=0; i<tb->size; i++) {
    GCObject *p = tb->hash[i];   //如图所示,获得第一个数组中第一个元素即GCObject*(它也代表了自身链表的第一个元素的位置)
    while (p) {  /* for each node in the list */  // p 表示的是
      GCObject *next = p->gch.next;  /* save next */   //保存该元素后面的链表地址
      unsigned int h = gco2ts(p)->hash;     

     // gco2ts(p)->hash 可以写作:if(p.gch.tt == LUA_TSTRING) return p->ts->  tsv


      int h1 = lmod(h, newsize);  /* new position */
      lua_assert(cast_int(h%newsize) == lmod(h, newsize));


      p->gch.next = newhash[h1];  /* chain it */ //一句话采用头插法进行链接链表

      newhash[h1] = p;
      p = next;
    }
  }
  luaM_freearray(L, tb->hash, tb->size, TString *);
  tb->size = newsize;
  tb->hash = newhash;
}
 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap