成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Lua源碼中字符串類型的實現(xiàn)

Lua源碼中字符串類型的實現(xiàn)

熱門標簽:地圖標注大廈 漳州智云呼電話機器人 清朝地圖標注哈爾濱 冀州市地圖標注 新岸線智能電銷機器人 怎么去除地圖標注 百度地圖標注早餐區(qū)域 武漢外呼防封系統(tǒng)多少錢 個人怎么在地圖標注需要的店鋪

 概述

    Lua完全采用8位編碼,Lua字符串中的字符可以具有任何數(shù)值編碼,包括數(shù)值0。也就是說,可以將任意二進制數(shù)據(jù)存儲到一個字符串中。Lua的字符串是不可變的值(immutable values)。如果修改,實質(zhì)上是新建一個字符串。根據(jù)上文《Lua中數(shù)據(jù)類型的源碼實現(xiàn)》中知道,在Lua中,字符串是自動內(nèi)存管理機制所管理的對象,并且由聯(lián)合體TString來實現(xiàn)存儲字符串值的。下面將通過Lua 5.2.1的源碼來看字符串的實現(xiàn)以及總結(jié)了在Lua中使用字符串的注意事項。

    源碼實現(xiàn)

    首先來看字符串對應的數(shù)據(jù)結(jié)構(gòu)TString,其源碼如下(lobject.h):

410 /* 
411 ** Header for string value; string bytes follow the end of this structure 
412 */ 
413 typedef union TString { 
414  L_Umaxalign dummy; /* ensures maximum alignment for strings */ 
415  struct { 
416   CommonHeader; 
417   lu_byte extra; /* reserved words for short strings; "has hash" for longs */ 
418   unsigned int hash; 
419   size_t len; /* number of characters in string */ 
420  } tsv; 
421 } TString; 

對這個聯(lián)合體定義,有幾點值得說明:

    I、聯(lián)合體TString中成員L_Umaxalign dummy是用來保證與最大長度的C類型進行對齊,其定義如下(llimits.h):

48 /* type to ensure maximum alignment */ 
49 #if !defined(LUAI_USER_ALIGNMENT_T) 
50 #define LUAI_USER_ALIGNMENT_T  union { double u; void *s; long l; } 
51 #endif 
52    
53 typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; 

在其他可會回收的對象(比如table)的實現(xiàn)中,也可看到這個聯(lián)合體成員,這樣做的目的是通過內(nèi)存對齊,加快CPU訪問內(nèi)存的速度。

    II、聯(lián)合體中成員tsv才是真正用來實現(xiàn)字符串的。其中成員CommonHeader用于GC,它會以宏的形式在所有的可回收對象中定義,代碼如下(lobject.h):

74 /* 
75 ** Common Header for all collectable objects (in macro form, to be 
76 ** included in other objects) 
77 */ 
78 #define CommonHeader  GCObject *next; lu_byte tt; lu_byte marked 

這個宏對應的結(jié)構(gòu)體形式如下(lobject.h):

81 /* 
82 ** Common header in struct form 
83 */ 
84 typedef struct GCheader { 
85  CommonHeader; 
86 } GCheader; 

結(jié)構(gòu)體GCheader在通用的可回收對象union GCObject的定義中有用到。

 III、lu_byte extra對于短字符串,用來記錄這個字符串是否為保留字,對于長字符串,可以用于惰性求Hash值;unsigned int hash成員是字符串對應的Hash值(在后面會具體講Lua是怎么計算字符串的Hash值的);size_t len用來表示字符串的長度。

 IV、上面的結(jié)構(gòu)體只是描述了一個字符串的結(jié)構(gòu),真正的字符串數(shù)據(jù)保存是緊隨在結(jié)構(gòu)體后面保存。

 在Lua5.2.1之前,不區(qū)分字符串長和短的字符串,所有的字符串保存在一個全局的Hash表中,對于Lua虛擬機來說,相同的字符串只有一份數(shù)據(jù),從Lua5.2.1開始,只是把短的字符串字符串(當前定義是長度小于等于40)放在全局Hash表中,而長字符串都是獨立生成,同時在計算Hash值時,引入一個隨機種子,這樣做的目的防止Hash Dos——攻擊者構(gòu)造出非常多相同Hash值的不同字符串,從而降低Lua從外部壓入字符串進入全局的字符串Hash表的效率。下面是Lua5.2.1中,生成一個新字符串的步驟,其相應的代碼都在lstring.c中:

 (1)若字符串長度大于LUAI_MAXSHORTLEN(默認值是40),則是長字符串,直接調(diào)用創(chuàng)建字符串接口的函數(shù)createstrobj(當然字符串的長度需要能保存在成員size_t len中,否則直接返回),代碼如下(lstring.c):

 95 /* 
 96 ** creates a new string object 
 97 */                                                  
 98 static TString *createstrobj (lua_State *L, const char *str, size_t l,                
 99                int tag, unsigned int h, GCObject **list) {              
100  TString *ts;                                            
101  size_t totalsize; /* total size of TString object */                       
102  totalsize = sizeof(TString) + ((l + 1) * sizeof(char));                      
103  ts = luaC_newobj(L, tag, totalsize, list, 0)->ts; 
104  ts->tsv.len = l; 
105  ts->tsv.hash = h; 
106  ts->tsv.extra = 0;                                         
107  memcpy(ts+1, str, l*sizeof(char)); 
108  ((char *)(ts+1))[l] = '\0'; /* ending 0 */                            
109  return ts; 
110 }  

可以看到把傳入的字符串具體內(nèi)存放在緊隨結(jié)構(gòu)體TString內(nèi)存后面,并且注意108行,字符串以”\0”結(jié)束與C語言字符串兼容的。

 (2)若字符串是短字符串,首先計算字符串的Hash值,找到對應的鏈表(短字符串的全局Hash表,使用的是鏈接法的方法,即把所有沖突的元素放在同一個鏈表中),查找當前要創(chuàng)建的字符串是否已經(jīng)在Hash表中,若已經(jīng)存在,則直接返回這個字符串。否則會調(diào)用函數(shù)newshrstr,而函數(shù)newshrstr會調(diào)用上面的createstrobj函數(shù)創(chuàng)建新字符串,并把新創(chuàng)建的字符串放到Hash表中,代碼如下(lstring.c)):

130 /* 
131 ** checks whether short string exists and reuses it or creates a new one 
132 */ 
133 static TString *internshrstr (lua_State *L, const char *str, size_t l) { 
134  GCObject *o; 
135  global_State *g = G(L); 
136  unsigned int h = luaS_hash(str, l, g->seed); 
137  for (o = g->strt.hash[lmod(h, g->strt.size)]; 
138    o != NULL; 
139    o = gch(o)->next) { 
140   TString *ts = rawgco2ts(o); 
141   if (h == ts->tsv.hash  
142     ts->tsv.len == l  
143     (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) { 
144    if (isdead(G(L), o)) /* string is dead (but was not collected yet)? */ 
145     changewhite(o); /* resurrect it */ 
146    return ts; 
147   } 
148  } 
149  return newshrstr(L, str, l, h); /* not found; create a new string */ 
150 } 

全局的字符串Hash表是保存在虛擬機全局狀態(tài)成員strt中的(lstate.h):

119  stringtable strt; /* hash table for strings */ 

而類型stringtable是一個結(jié)構(gòu)體,其定義如下(lstate.h):

59 typedef struct stringtable {                                     
60  GCObject **hash; 
61  lu_int32 nuse; /* number of elements */ 
62  int size; 
63 } stringtable; 

其中成員GCObject **hash是一個指針數(shù)組,數(shù)組中每個成員實質(zhì)指向TString(注意TString中包括宏CommonHeader,該宏中的next成員可以構(gòu)造出Hash表中開散的鏈表);nuse是數(shù)組hash中已經(jīng)被使用的元素個數(shù);size是當前數(shù)組hash的大小。

在函數(shù)newshrstr插入新的字符串前,都會判斷nuse值是否大于size,若大于,表明Hash表大小不夠需要擴充,則把Hash表的大小擴充到原來的2倍,對應的代碼如下(lstring.c):

121  if (tb->nuse >= cast(lu_int32, tb->size)  tb->size = MAX_INT/2)                 
122   luaS_resize(L, tb->size*2); /* too crowded */  

在gc的時候,會判斷nuse是否比size/2還?。ㄔ贚ua 5.1中是把nuse與size/4比較),如果是的話就重新resize這個stringtable的大小為原來的一半。對應的代碼如下(lgc.c):

783   int hs = g->strt.size / 2; /* half the size of the string table */               
784   if (g->strt.nuse  cast(lu_int32, hs)) /* using less than that half? */            
785    luaS_resize(L, hs); /* halve its size */ 

對于字符串比較,首先比較類型,若是不同類型字符串,則肯定不相同,然后區(qū)分短字符串和長字符串,對于短字符串,若兩者指針值相等,則相同,否則不相同;對應長字符串,則首先比較指針值,若不同,則比較長度值和內(nèi)容逐字符比較。

  總結(jié)

 (1)Lua中的保留字和元方法名都是做為短字符串的,他們在虛擬機啟動的時候就已經(jīng)放入到全局短的字符串Hash表,并且是不回收的。

 (2)查找字符是比較高效的,但是修改或插入字符串都是比較低效的,這里面除了計算外,至少要把外面的字符串拷貝到虛擬機中。

 (3)對應長字符串的Hash值,Lua是不會考察每個字符的,因而能避免快速計算長字符串的散列值,其相應的代碼如下(lstring.c):

51 unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) {               
52  unsigned int h = seed ^ l;                                     
53  size_t l1;                                             
54  size_t step = (l >> LUAI_HASHLIMIT) + 1;                              
55  for (l1 = l; l1 >= step; l1 -= step)                                
56   h = h ^ ((h5) + (h>>2) + cast_byte(str[l1 - 1]));                       
57  return h;                                             
58 }  
21 /*                                                 
22 ** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to                 
23 ** compute its hash                                         
24 */                                                  
25 #if !defined(LUAI_HASHLIMIT)                                     
26 #define LUAI_HASHLIMIT   5                                    
27 #endif 

 (4)當有多個字符串連接時,不應該直接用字符串連接運算符”..”,而是用table.concat操作或者是string.format來加快字符串連接的操作。

 (5)Lua中字符串Hash算法用的是JSHash,關(guān)于字符串的各種Hash函數(shù),網(wǎng)絡有篇文章對它進行了總結(jié):https://www.byvoid.com/blog/string-hash-compare

以上所述誰就是本文的全部內(nèi)容了,希望能對大家學習lua有所幫助。

您可能感興趣的文章:
  • Lua中使用table.concat連接大量字符串實例
  • Lua教程(五):C/C++操作Lua數(shù)組和字符串示例
  • Lua中字符串(string)淺析
  • Lua字符串庫中的幾個重點函數(shù)介紹
  • Lua函數(shù)與字符串處理簡明總結(jié)
  • 使用lua實現(xiàn)split字符串分隔
  • Lua中的string庫(字符串函數(shù)庫)總結(jié)
  • Lua字符串模式匹配函數(shù)小結(jié)
  • Lua字符串庫(string庫)學習筆記

標簽:金昌 天門 臺灣 儋州 宣城 德宏 天門 濰坊

巨人網(wǎng)絡通訊聲明:本文標題《Lua源碼中字符串類型的實現(xiàn)》,本文關(guān)鍵詞  Lua,源碼,中,字符串,類型,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Lua源碼中字符串類型的實現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Lua源碼中字符串類型的實現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产成a人亚洲精v品| 亚洲美女av电影| 亚洲第一区第二区| jizz一区二区| 亚洲美女视频网站| 国产精品午夜视频| 国产天堂素人系列在线视频| 欧美另类极品videosbest视频| 老熟妇精品一区二区三区| 一区二区三区国产精品| 老鸭窝毛片一区二区三区| 欧美高清性xxxxhd| 色婷婷亚洲mv天堂mv在影片| 国产成人精品一区二区三区视频| 成人污网站在线观看| 国产又粗又猛又爽视频| 久久97超碰国产精品超碰| 国产综合在线播放| 亚洲第一网站免费视频| 国产网站欧美日韩免费精品在线观看| caopen在线视频| 电影天堂国产精品| 国产性色av一区二区| 国产精品成人一区二区三区夜夜夜| 日本高清免费不卡视频| 亚洲欧美天堂| 色网在线免费观看| 成年女人免费毛片视频永久| 国产精品视频你懂的| 日本精品久久久久中文字幕| 欧美日韩精品欧美日韩精品一| 国产不卡视频| 色综合男人天堂| 日本欧美韩国国产| 久热国产在线| jjzzjjzzjjzz| 一区二区三区视频在线| 精品成人无码一区二区三区| 久久精品视频一区二区| 日韩欧美国产高清91| 青青在线免费观看视频| 国产 xxxx| 警花观音坐莲激情销魂小说| 欧美在线视频免费| 最近中文字幕在线免费观看| 国产v日产∨综合v精品视频| 国产aⅴ精品一区二区三区色成熟| 91捆绑美女网站| 牛牛在线精品视频| 中文字幕高清一区| 蜜桃专区在线| jizz大全欧美jizzcom| 国产精品美女xx| 色偷偷噜噜噜亚洲男人的天堂| 韩国国内大量揄拍精品视频| 亚洲午夜激情| 国模私拍视频在线| 另类欧美日韩国产在线| 欧美一级中文字幕| 亚洲www色| www免费在线观看| 在线亚洲高清视频| 天天操人人干| 亚洲区 欧美区| 精品福利一二区| 亚洲视频在线免费播放| 色8久久影院午夜场| 日韩在线中文字幕视频| 亚洲激情中文| 日韩小视频网站| 日本欧美一区二区三区乱码| 久久久一区二区三区四区| 日本污视频在线观看| 免费三片60分钟| 91精品国产一区二区人妖| 欧美国产日产图区| 精品福利在线| 三级精品视频| 黄色三级生活片| 中文字幕有码在线播放| 亚洲精品动漫久久久久| 天堂а√在线中文在线鲁大师| 国产在线不卡一区| 黄色av网站免费| www.一区二区三区| 91九色丨porny丨国产jk| 亚洲一二三专区| 日韩国产一区三区| 亚洲精一区二区三区| 亚洲男同性恋视频| 国产91色在线|亚洲| 日韩黄色a级片| 91欧美国产| 国产一区二区美女| 日韩无一区二区| 中文字幕一区二区人妻在线不卡| 国产麻豆精品| 少妇免费视频| 久久精品久久综合| 午夜久久99| 激情中文字幕| 成人一二三四区| 日韩美女一区二区三区四区| 黄色片在线播放| 久草视频国产在线| 97在线免费视频观看| 国产白丝网站精品污在线入口| 成人精品水蜜桃| 国产又粗又猛又爽| 色噜噜狠狠狠综合曰曰曰88av| 日本一区二区三区在线视频| 国内一区二区在线| 欧美妇女性影城| 亚洲欧美日韩三级| av在线免费一区| 一区二区视频| 伊人网在线观看| 综合久久成人| 久久精品国内一区二区三区水蜜桃| 欧美一级特黄aaaaaa大片在线观看| 欧美久久久影院| 婷婷中文字幕一区三区| 亚洲黄色片免费看| 三上悠亚国产精品一区二区三区| 蜜臀a∨国产成人精品| 日韩网站中文字幕| 久久免费区一区二区三波多野| 91丝袜脚交足在线播放| av在线无限看| 青青草原播放器| 99热最新在线| 国产一区观看| 草美女在线观看| 亚洲精品中文字| 男女爱爱福利视频| 亚洲你懂的在线视频| 国产日韩欧美另类| 欧美乱大交xxxxx另类| 夫妻免费无码v看片| 美女免费久久| 欧美人与性动交a欧美精品| 亚洲日本一区二区三区在线不卡| 精品一区二区日韩| 国产男女免费视频| 夜夜躁狠狠躁日日躁av| 国产日韩精品在线播放| 51精品久久久久久久蜜臀| 日本三级电影在线看| 久草视频精品在线| 精品国产一区二区三区久久久| 777琪琪电影午夜理伦片| 欧美日韩激情电影| 日韩综合网站| 亚洲一二三区视频在线观看| 久久99国产乱子伦精品免费| 亚洲乱码中文字幕| 操人视频在线观看| 亚洲天堂免费视频| 国产亚洲精品精品国产亚洲综合| jizzjizzjizz亚洲| 国产aaaaa毛片| 色偷偷精品视频在线播放| 一区二区三区四区不卡| 成人免费无遮挡无码黄漫视频| 国产精品久久久久久久久久齐齐| 欧美最新另类人妖| 成人1区2区| 精品久久久久久综合日本欧美| 国产日韩欧美一区二区三区四区| 视频一区二区视频| www.亚洲国产| 视频免费在线看| 国产在线拍揄自揄拍视频| 91精品视频网站| 国产精品久久久久野外| 国产麻豆剧果冻传媒视频杜鹃| 秋霞视频一区二区| 看欧美日韩国产| 亚洲精品网站在线观看| 国产探花一区在线观看| 最新免费av网址| 精品国产一区二区三区久久久| 69sex久久精品国产麻豆| 精品人妻伦一区二区三区久久| 成人高清免费| 韩日电影在线观看| japanese在线播放| 韩国欧美国产一区| av黄色在线看| 国产亚洲第一伦理第一区| 免费观看又色又爽又黄的网站| 色呦呦网站在线观看| 中文字幕在线播放日韩| 欧美午夜电影一区二区三区| 欧美性猛xxx| 无套内谢丰满少妇中文字幕| 91精品国产乱码久久久竹菊| 一菊综合网成人综合网| 91视频成人免费| 国产67194| 青青久久av北条麻妃海外网| 日韩国产精品一区二区| 亚洲国产99精品国自产| 国产精品久久久免费看| 三级毛片电影网站| 800av在线免费观看| 国产无色aaa| 色噜噜偷拍精品综合在线| 猫咪av永久| av老司机久久| 亚洲成年人影院在线| 92久久精品| 国产精品福利无圣光在线一区| 高跟丝袜欧美一区| 五月天久久777| 国产精品二区在线观看| 97视频在线播放| 九九久久久久午夜精选| 欧美特黄一级| 国产成人精品一区二区免费看京| 91视频免费在线| 9l亚洲国产成人精品一区二三| 天堂8在线视频| 亚洲999一在线观看www| 草草视频在线一区二区| 日本三级韩国三级欧美三级| 中文字幕在线不卡一区| 精品国产一区二区三区久久狼黑人| 免费网站观看电影入口| 欧美双性人妖o0| 黄色免费视频| 3751色影院一区二区三区| 久草国产在线视频| 国产盗摄视频一区二区三区| 欧美性色xo影院| 天天操天天操天天操天天操天天操| 777久久久精品一区二区三区| 人妻精品一区一区三区蜜桃91| 领导边摸边吃奶边做爽在线观看| 久久久久久久久久久久久久久| 亚洲av成人精品日韩在线播放| 美女的诞生在线观看高清免费完整版中文| 国产精品久久成人免费观看| 免费午夜一级| 日本一区二区免费不卡| 欧美 国产 日本| 日韩精品午夜| 天天天综合网| 成年黄网站在线观看免费| 国产又色又爽又黄刺激在线视频| 国产极品视频| 久久午夜宅男免费网站| 成人h动漫精品一区二区器材| 69av.com| 日本19禁啪啪吃奶大尺度| 日韩大片在线观看| 成人观看免费视频| 国产97在线视频| 最后生还者第二季在线观看| 国产精品视频一区二区三区四蜜臂| 视频一区亚洲| 成人网免费视频| 一级欧美视频| 中文子幕无线码一区tr| 亚洲a一级视频| 韩国精品一区二区三区| 中文字幕视频观看| 在线视频亚洲自拍| 国产不卡一二三区| 影音先锋中文字幕影院| 国产精品99一区二区| 欧美日韩精品一区二区视频| 日韩视频在线免费看| 69ww免费视频播放器| 一本色道久久88亚洲综合88| 久久夜色精品| 亚洲天堂影视av| 懂色av中文字幕一区二区三区| 欧美在线免费看| 中文字幕亚洲高清| 男女性激情视频在线观看| 怡红院一区二区三区| 色偷偷成人一区二区三区91| 丝袜制服影音先锋| 懂色aⅴ精品一区二区三区| 欧美 变态 另类 人妖| 久久久夜夜夜| 麻豆视频在线观看免费网站黄| 人人狠狠综合久久亚洲婷婷| 国产精品久久久91| 国产一区在线视频观看| 91大神精品| 国产在线拍偷自揄拍精品| 国产精品白丝jk黑袜喷水| 八戒八戒神马在线电影| 伊人久久国产精品| 92国产精品观看| 国产亚洲欧美在线精品| 欧美gay囗交囗交| 国产亚洲精品久久久久久777| 狠狠激情五月综合婷婷俺| 免费av片在线观看一道本| 老太脱裤子让老头玩xxxxx| 国产精品99999| 欧美性猛交xxxx乱大交hd| 97久草视频| 992tv成人免费视频| 欧美成人一二三| 中文字幕中文字幕精品| 国产成人自拍在线| 欧美极品在线视频| 九色porny丨首页在线| 国产日韩欧美精品综合| 国产高清视频免费在线观看| 亚洲精品性视频| 国产精品久久久久国产a级| 日日摸夜夜添夜夜添毛片av| 亚洲a一级视频| 中文字幕亚洲综合| 亚洲图片激情小说| 白嫩情侣偷拍呻吟刺激| 久久99精品久久久久久噜噜| 黄色特一级视频| 国产男小鲜肉同志免费| 午夜久久久久久| 亚洲爆乳无码专区| 国产精品 欧美激情| 日韩视频精品在线|