Lua中資料類型的源碼實現,lua資料類型源碼

來源:互聯網
上載者:User

Lua中資料類型的源碼實現,lua資料類型源碼

    概述

    在Lua中有8種基礎類型:nil、boolean、number、string、userdata、function、thread和table。可以使用函數type查看某個變數或值的類型,返回相應的類型名稱。像其他動態語言一樣,在語言中沒有類型定義的文法,每個值都攜帶了它自身的類型資訊。下面將通過Lua 5.2.1的源碼來看類型的實現。

   源碼實現

     Lua將值表示成帶標誌的聯合結構,代碼如下(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 };



可以看出結構體有兩個成員:

    一個是整型的tt_用來表示資料類型,Lua中所有的資料類型定義如下(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

可以看到實現了9種資料類型,其中把文法中userdata分為LUA_TLIGHTUSERDATA和LUA_TUSERDATA,其中前一種類型即為輕量級userdata(light userdata),輕量級userdata是一種表示C指標的值,對Lua虛擬機器來說,這種資料類型不需要GC(記憶體回收),其指向的記憶體由使用者指派和釋放;後一種userdata類型完全userdata(full userdata),記憶體是由Lua虛擬機器分配,並有GC機制負責處理。

 結構體lua_TValue另一個資料成員是value_,它是一個聯合體,代碼如下(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 };



通過注釋,可以很容易理解每個成員的含義,但有必要對以下幾個成員說明:

    numfield:用來表示所有數值,其實質對應的是double類型。包括整型也是用這個來表示。另外在Lua 5.3實現,分開了整型和浮點數的表示。

    GCObject *gc:用來指向那些需要記憶體回收的對象,包括string、table、function、完全userdata和thread類型。GCObject用來表示可以記憶體回收的對象,它也是一個聯合體,其代碼如下(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回收機制使用。其他成員比如TString ts才是真正儲存值的結構,而這些資料結構也會有GCheader,用於GC管理。

    總的來說,Lua中各種數值類型結構如下:



    最後,關於Lua的資料類型實現,值得指出使用帶標誌的結構體來表示Lua的數值類型,使得Lua中任何一種資料類型至少佔用的空間是個16位元組(結構體還需要對其),就算nil類型,也會佔用8個位元組的空間,因此拷貝Lua值是比較耗時的。下一篇文章將討論Lua字串的實現。

參考資料

http://blog.aliyun.com/761

lua5.2.1源碼








聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.