当前位置: 移动技术网 > IT编程>开发语言>C/C++ > lua字符串类型

lua字符串类型

2018年12月19日  | 移动技术网IT编程  | 我要评论

虫不知粤语,苏宁与京东,sooyuu

lua中字符串结构体的定义是:

typedef union tstring {
  l_umaxalign dummy;  /* ensures maximum alignment for strings */
  struct {
    commonheader;
    lu_byte reserved;
    unsigned int hash;
    size_t len;
  } tsv;
} tstring;

这里tstring结构体是一个union, 最开始的l_umaxalign dummy;起到的是对齐作用.紧跟着是commonheader,可以看出tstring也是可gc数据类型的一种.

在lua中,字符串是一个保存在一个全局的地方,在globale_state的strt里面,这是一个hash数组,专门用于存放字符串:

typedef struct stringtable {
  gcobject **hash;
  lu_int32 nuse;  /* number of elements */
  int size;
} stringtable;

一个字符串tstring,首先根据hash算法算出hash值,这就是stringtable中hash的索引值,如果这里已经有元素,则使用链表串接起来.

同时,tstring中的字段reserved,表示这个字符串是不是保留字符串,比如lua的关键字,在最开始赋值的时候是这么处理的:

void luax_init (lua_state *l) {
  int i;
  for (i=0; itsv.reserved = cast_byte(i+1);  /* reserved word */
  }
}

这里存放的值,是数组luax_tokens中的索引:

const char *const luax_tokens [] = {
    "and", "break", "do", "else", "elseif",
    "end", "false", "for", "function", "if",
    "in", "local", "nil", "not", "or", "repeat",
    "return", "then", "true", "until", "while",
    "..", "...", "==", ">=", "<=", "~=",
    "", "", "", "",
    null
};

一方面可以迅速定位到是哪个关键字,另方面如果这个reserved字段不为0,则表示该字符串是不可自动回收的,在gc过程中会略过这个字符串的处理.

具体查找字符串时,首先计算出hash值,定位到所在的strt中的hash数组所在,再遍历hash桶所在链表,首先比较长度,如果相同再继续逐字节的比较字符串内容:

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 */
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网