Lua原始碼閱讀三 lua字串快取

2021-05-23 21:47:36 字數 1489 閱讀 8715

本篇文章,主要**一下lua中的字串快取管理(涉及到的檔案 lstring.c )。

在lua的9種資料型別中,字串是屬於可以被gc**的型別。在lua中,操作字串實際上是在操作字串引用,當字串不在被使用的時候,gc會通過一定演算法**。

--lua9種資料型別:

字串分配

--原始碼:

ts = cast(tstring *, luam_malloc(l, (l+1)*sizeof(char)+sizeof(tstring)));

--該行**申請放置字串的記憶體,luam_malloc是申請記憶體的乙個巨集定義,呼叫上篇文章中提到的luam_realloc_ 函式來來分配記憶體,在lua中字串是用結構

表示的,所以申請的記憶體大小是(l+1)*sizeof(char)+sizeof(tstring),記憶體分布:tstring+str+'/0',然後給tstring賦值hash code, len,marted,reserved,拷貝字串。

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++;

--接下來,將分配的字串掛到全域性字串管理物件strt上

if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= max_int/2)

luas_resize(l, tb->size*2);  /* too crowded */

--對字串大小的擴充

字串快取

--原始碼:

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]));

---根據字串長度l和字串內容str計算字串hash code,字串hash code用作該字串的key,後續用作字串快取key,這個演算法可以保證key-value一一對應。

for (o = g(l)->strt.hash[lmod(h, g(l)->strt.size)];

o != null;

o = o->gch.next)

}--在字串全域性管理物件中查詢該字串,如果查到就使用該字串返回,否則:

return newlstr(l, str, l, h);

申請記憶體放置字串。

Lua原始碼閱讀筆記 string字串

lobject.h string headers for string table typedef union tstring tsv tstring 上面是lua中字串的資料結構。可以看到,tstring中並沒有出現顯式的char 變數,而是儲存了雜湊值和長度。所以,這裡面沒有儲存字元嗎?我們來看...

lua 原始碼閱讀 1 1 2 1

lua 1.1 閱讀 1.hash.c 中 a 對建立的 hash array 用 listhead 鏈式結構來管理,新增lua hashcollector,用來做 hash 的 處理。ps 1.0 用的是個 512 的陣列,用乙個少乙個 b hash lua createarray int nha...

LUA 原始碼閱讀筆記(一)

背景介紹 因為工作的需要,後台svr要能夠動態修改更新,使用c當然沒有問題,問題就在於修改原始碼後,需要重啟服務。所以就想到在c裡能夠嵌入一種指令碼,最好是和c無縫結合的。因此就想到使用到lua,lua的大名圈內人士應該早有耳聞,只不過一直沒有機會接觸。機緣巧合,有幸一見。俗話說得好,耳聞不如一見。...