本篇文章,主要**一下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的大名圈內人士應該早有耳聞,只不過一直沒有機會接觸。機緣巧合,有幸一見。俗話說得好,耳聞不如一見。...