lua 字符串处理
2015-11-03 17:20
363 查看
在lua中字符串在内部会被复用。
例如你调用lua_pushstring函数,lua首先会为字符串计算一个hash值,然后会用这个值去查状态(lua_State)中的一个全局变量strt,strt是一个哈希数组。lua使用hash和strt将查找范围缩小,然后遍历具有相同hash值的字符串。如果找到相同的字符串就返回这个存在的。如果没有才会创建一个新的字符串,同时这个字符串放入到hash表strt中。
luaS_newlstr首先计算hash值。然后在到hash值lmod相同的表中进行遍历,如果找到就直接返回。如果找不到就创建一个新的使用函数newlstr.
例如你调用lua_pushstring函数,lua首先会为字符串计算一个hash值,然后会用这个值去查状态(lua_State)中的一个全局变量strt,strt是一个哈希数组。lua使用hash和strt将查找范围缩小,然后遍历具有相同hash值的字符串。如果找到相同的字符串就返回这个存在的。如果没有才会创建一个新的字符串,同时这个字符串放入到hash表strt中。
TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { GCObject *o; unsigned int h = cast(unsigned int, l); /* seed */ size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ size_t l1; for (l1=l; l1>=step; l1-=step) /* compute hash */ h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; o != NULL; o = o->gch.next) { TString *ts = rawgco2ts(o); if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) { /* string may be dead */ if (isdead(G(L), o)) changewhite(o); return ts; } } return newlstr(L, str, l, h); /* not found */ }
luaS_newlstr首先计算hash值。然后在到hash值lmod相同的表中进行遍历,如果找到就直接返回。如果找不到就创建一个新的使用函数newlstr.
static TString *newlstr (lua_State *L, const char *str, size_t l, unsigned int h) { TString *ts; stringtable *tb; if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) luaM_toobig(L); ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString))); ts->tsv.len = l; ts->tsv.hash = h; ts->tsv.marked = luaC_white(G(L)); ts->tsv.tt = LUA_TSTRING; ts->tsv.reserved = 0; memcpy(ts+1, str, l*sizeof(char)); ((char *)(ts+1))[l] = '\0'; /* ending 0 */ tb = &G(L)->strt; h = lmod(h, tb->size); ts->tsv.next = tb->hash[h]; /* chain new entry */ tb->hash[h] = obj2gco(ts); tb->nuse++; if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) luaS_resize(L, tb->size*2); /* too crowded */ return ts; }
相关文章推荐
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言
- Lua中获取table长度问题探讨