在lua中用union TString來表示字符串類型數組
lobject.h:函數
其中結構體tsv中 reserved字段表示字符串是否是保留關鍵字,hash是其哈希值,len是其長度。咱們在TString中沒有看到lua將字符串的內容存在任何地方啊,其實lua是將內容同一存在了另外一個地方,global_state中的strt裏面:lua
lstate.h:指針
lstate.h:blog
其中字段hash爲二維數組,這裏面保存了lua中全部的字符串。接下來讓咱們來看看lua是怎樣生成一個字符串的吧:字符串
lstring.h:string
lua利用luaS_new來new一個string,而真正new string的是在函數luaS_newlstr中:hash
lstring.c:io
首先計算出字符串的hash值,而後代碼G(L)->strt.hash[lmod(h, G(L)->strt.size)]找出hash的對應位置,這個哈希表是鏈表實現的,所以在for循環中查找鏈表,當鏈表中已經存在對應的字符串時作一些判斷而後返回這個已經存在的字符串指針TString *,若不存在則使用newlstr來new一個字符串並將其加到global_state中的strt中。for循環
lstring.c: