實(shí)現(xiàn)Lua中數(shù)據(jù)類型的源碼分享
概述
在Lua中有8種基礎(chǔ)類型:nil、boolean、number、string、userdata、function、thread和table。可以使用函數(shù)type查看某個(gè)變量或值的類型,返回相應(yīng)的類型名稱。像其他動(dòng)態(tài)語言一樣,在語言中沒有類型定義的語法,每個(gè)值都攜帶了它自身的類型信息。下面將通過Lua 5.2.1的源碼來看類型的實(shí)現(xiàn)。
源碼實(shí)現(xiàn)
Lua將值表示成帶標(biāo)志的聯(lián)合結(jié)構(gòu),代碼如下(lobject.h):
90 /* 91 ** Union of all Lua values 92 */ 93 typedef union Value Value; 100 /* 101 ** Tagged Values. This is the basic representation of values in Lua, 102 ** an actual value plus a tag with its type. 103 */ 104 105 #define TValuefields Value value_; int tt_ 400 struct lua_TValue { 401 TValuefields; 402 };
可以看出結(jié)構(gòu)體有兩個(gè)成員:
一個(gè)是整型的tt_用來表示數(shù)據(jù)類型,Lua中所有的數(shù)據(jù)類型定義如下(lua.h):
78 #define LUA_TNIL 0 79 #define LUA_TBOOLEAN 1 80 #define LUA_TLIGHTUSERDATA 2 81 #define LUA_TNUMBER 3 82 #define LUA_TSTRING 4 83 #define LUA_TTABLE 5 84 #define LUA_TFUNCTION 6 85 #define LUA_TUSERDATA 7 86 #define LUA_TTHREAD 8
可以看到實(shí)現(xiàn)了9種數(shù)據(jù)類型,其中把語法中userdata分為LUA_TLIGHTUSERDATA和LUA_TUSERDATA,其中前一種類型即為輕量級(jí)userdata(light userdata),輕量級(jí)userdata是一種表示C指針的值,對(duì)Lua虛擬機(jī)來說,這種數(shù)據(jù)類型不需要GC(垃圾回收),其指向的內(nèi)存由用戶分配和釋放;后一種userdata類型完全userdata(full userdata),內(nèi)存是由Lua虛擬機(jī)分配,并有GC機(jī)制負(fù)責(zé)處理。
結(jié)構(gòu)體lua_TValue另一個(gè)數(shù)據(jù)成員是value_,它是一個(gè)聯(lián)合體,代碼如下(lobject.h):
96 #define numfield lua_Number n; /* numbers */ 103 typedef LUA_NUMBER lua_Number;(lua.h) 392 #define LUA_NUMBER double(luaconf.h) 391 union Value { 392 GCObject *gc; /* collectable objects */ 393 void *p; /* light userdata */ 394 int b; /* booleans */ 395 lua_CFunction f; /* light C functions */ 396 numfield /* numbers */ 397 };
通過注釋,可以很容易理解每個(gè)成員的含義,但有必要對(duì)以下幾個(gè)成員說明:
numfield:用來表示所有數(shù)值,其實(shí)質(zhì)對(duì)應(yīng)的是double類型。包括整型也是用這個(gè)來表示。另外在Lua 5.3實(shí)現(xiàn),分開了整型和浮點(diǎn)數(shù)的表示。
GCObject *gc:用來指向那些需要垃圾回收的對(duì)象,包括string、table、function、完全userdata和thread類型。GCObject用來表示可以垃圾回收的對(duì)象,它也是一個(gè)聯(lián)合體,其代碼如下(lstate.h)
185 union GCObject { 186 GCheader gch; /* common header */ 187 union TString ts; 188 union Udata u; 189 union Closure cl; 190 struct Table h; 191 struct Proto p; 192 struct UpVal uv; 193 struct lua_State th; /* thread */ 194 };
其中成員GCheader gch主要用于GC回收機(jī)制使用。其他成員比如TString ts才是真正存儲(chǔ)值的結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)也會(huì)有GCheader,用于GC管理。
總的來說,Lua中各種數(shù)值類型結(jié)構(gòu)如下:
最后,關(guān)于Lua的數(shù)據(jù)類型實(shí)現(xiàn),值得指出使用帶標(biāo)志的結(jié)構(gòu)體來表示Lua的數(shù)值類型,使得Lua中任何一種數(shù)據(jù)類型至少占用的空間是個(gè)16字節(jié)(結(jié)構(gòu)體還需要對(duì)其),就算nil類型,也會(huì)占用8個(gè)字節(jié)的空間,因此拷貝Lua值是比較耗時(shí)的。下一篇文章將討論Lua字符串的實(shí)現(xiàn)。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
- 詳解Lua中的數(shù)據(jù)類型
- Lua判斷數(shù)據(jù)類型的方法
- Lua數(shù)據(jù)類型介紹
- Lua中的基本數(shù)據(jù)類型詳細(xì)介紹
- Lua學(xué)習(xí)筆記之?dāng)?shù)據(jù)類型
- 深入探究Lua中的解析表達(dá)式
- Lua教程(三):表達(dá)式和語句
- Lua學(xué)習(xí)筆記之表達(dá)式
- Lua表達(dá)式和控制結(jié)構(gòu)學(xué)習(xí)筆記
- Lua中的操作符和表達(dá)式總結(jié)
- Lua基礎(chǔ)教程之賦值語句、表達(dá)式、流程控制、函數(shù)學(xué)習(xí)筆記
- Lua學(xué)習(xí)筆記之運(yùn)算符和表達(dá)式
- Lua中基本的數(shù)據(jù)類型、表達(dá)式與流程控制語句講解
相關(guān)文章
Lua中關(guān)于元方法的一些知識(shí)點(diǎn)小結(jié)
這篇文章主要介紹了Lua中關(guān)于元方法的一些知識(shí)點(diǎn)小結(jié),本文講解了兩個(gè)具有不同元表的值進(jìn)行算術(shù)操作、關(guān)系類的元方法、保護(hù)元表,需要的朋友可以參考下2014-09-09Lua面向?qū)ο缶幊讨惖暮唵螌?shí)現(xiàn)方式
這篇文章主要介紹了Lua面向?qū)ο缶幊讨惖暮唵螌?shí)現(xiàn)方式,本文直接給出一個(gè)類的編碼實(shí)例,并詳細(xì)講解了調(diào)用方式,需要的朋友可以參考下2015-04-04linux系統(tǒng)安裝Nginx Lua環(huán)境
因項(xiàng)目需求,需要在Linux系統(tǒng)下搭建一套nginx+lua的開發(fā)環(huán)境,經(jīng)過一番摸索,現(xiàn)總結(jié)如下,希望大家能夠喜歡。2016-12-12Lua的編譯、執(zhí)行和調(diào)試技術(shù)介紹
這篇文章主要介紹了Lua的編譯、執(zhí)行和調(diào)試技術(shù)介紹,本文著重講解了對(duì)錯(cuò)誤的處理,另外也講解了編譯和執(zhí)行等知識(shí),需要的朋友可以參考下2015-04-04Lua學(xué)習(xí)筆記之運(yùn)算符和表達(dá)式
這篇文章主要介紹了Lua學(xué)習(xí)筆記之運(yùn)算符和表達(dá)式,本文在代碼中使用注釋對(duì)Lua的運(yùn)算符和表達(dá)式做了講解,需要的朋友可以參考下2014-09-09