国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

實現Lua中數據類型的源碼分享

2024-07-21 23:04:27
字體:
來源:轉載
供稿:網友

概述

    在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數據類型實現

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

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 科尔| 锦屏县| 紫金县| 焦作市| 威信县| 扬中市| 定西市| 彩票| 湟源县| 额济纳旗| 兴山县| 日照市| 苍南县| 苏尼特右旗| 海淀区| 讷河市| 呼和浩特市| 广平县| 抚顺县| 黔东| 玉屏| 永和县| 城固县| 泰和县| 福贡县| 林甸县| 英德市| 普宁市| 府谷县| 阳曲县| 西安市| 科技| 马尔康县| 长顺县| 博爱县| 肃南| 东光县| 株洲县| 清水河县| 沙田区| 怀安县|