1. 程式人生 > >Lua 字串TString資料結構即演算法分析

Lua 字串TString資料結構即演算法分析

這裡主要寫Lua中的字串TString相關結構和演算法。文章中沒有貼Lua原始碼,只畫出了結構圖,和演算法的虛擬碼。這樣閱讀起來更加直觀。

一、TString的概述

1、lua中字串是常量,例s = s .. 1 建立了一個新的字串賦值給s,並不是改變了s字串中的資料。 2、lua中字串分為長字串和短字串。 長字串和短字串區別 (1)儲存方式: 短字串:全域性儲存一份 長字串:多份 (2)hash值計算時機: 短字串:建立時立刻計算 長字串:惰性計算,使用時在計算(例如字串做table的key時) 二、資料結構 1、TString結構 extra: 短字串:是否是保留字 長字串:是否計算了hash
strlen:短字串長度 hash:字串hash值 lngLen:長字串長度 hNext:桶hash表衝突時,指向下個節點的指標 TString後邊跟著的是字串資料 2、stringtable stringtable儲存在g_state中 hash:指向儲存了短字串指標的桶陣列 nuse:陣列中字串數量 size:陣列大小 三、演算法 這裡只寫虛擬碼,這樣看上去更加直觀。 1、建立 { 短字串: 計算hash值 是否已經存在字串 是:複用字串 否:建立新的字串,放入hash桶陣列中 長字串: 建立字串 } 2、相等比較 { 短字串:直接比較地址 長字串:地址相等 || (長度相等 && 逐位元組比較)
} 四、總結 Lua 中可以儲存任何8位元組的字元 但是它不以/0為結尾 而是在資料內部用一個長度來表示其字串所佔的記憶體大小,字串以引用方式存在, 字串一旦被建立則不可被改寫,字串屬於垃圾回收物件,一旦沒有引用,則被銷燬 TString中並沒有存放字串的實際資料,只是記錄了一些操作字串的輔助資訊,其實真正的字串資料放在了TString之後的一塊記憶體中, 也就是 一個完整的TString的記憶體為 sizeof(TString) + shrlen * sizeof(char) 所有的短字串都儲存在全域性的global_State,並且全域性只有一份,短字串建立時立即計算hash值,而長字串惰性計算hash值(也就是需要的時候再計算)。