最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實現(xiàn)Lua中數(shù)據(jù)類型的源碼分享

 更新時間:2015年04月10日 10:05:43   投稿:hebedich  
在Lua中有8種基礎(chǔ)類型,像其他動態(tài)語言一樣,在語言中沒有類型定義的語法,每個值都攜帶了它自身的類型信息。下面我們就來嘗試通過Lua 5.2.1的源碼來看類型的實現(xiàn)

概述

    在Lua中有8種基礎(chǔ)類型:nil、boolean、number、string、userdata、function、thread和table??梢允褂煤瘮?shù)type查看某個變量或值的類型,返回相應(yīng)的類型名稱。像其他動態(tài)語言一樣,在語言中沒有類型定義的語法,每個值都攜帶了它自身的類型信息。下面將通過Lua 5.2.1的源碼來看類型的實現(xiàn)。

   源碼實現(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)體有兩個成員:

    一個是整型的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 

可以看到實現(xiàn)了9種數(shù)據(jù)類型,其中把語法中userdata分為LUA_TLIGHTUSERDATA和LUA_TUSERDATA,其中前一種類型即為輕量級userdata(light userdata),輕量級userdata是一種表示C指針的值,對Lua虛擬機來說,這種數(shù)據(jù)類型不需要GC(垃圾回收),其指向的內(nèi)存由用戶分配和釋放;后一種userdata類型完全userdata(full userdata),內(nèi)存是由Lua虛擬機分配,并有GC機制負(fù)責(zé)處理。

 結(jié)構(gòu)體lua_TValue另一個數(shù)據(jù)成員是value_,它是一個聯(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 }; 

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

    numfield:用來表示所有數(shù)值,其實質(zhì)對應(yīng)的是double類型。包括整型也是用這個來表示。另外在Lua 5.3實現(xiàn),分開了整型和浮點數(shù)的表示。

    GCObject *gc:用來指向那些需要垃圾回收的對象,包括string、table、function、完全userdata和thread類型。GCObject用來表示可以垃圾回收的對象,它也是一個聯(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回收機制使用。其他成員比如TString ts才是真正存儲值的結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)也會有GCheader,用于GC管理。

    總的來說,Lua中各種數(shù)值類型結(jié)構(gòu)如下:

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

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

相關(guān)文章

  • Lua教程(十九):C調(diào)用Lua

    Lua教程(十九):C調(diào)用Lua

    這篇文章主要介紹了Lua教程(十九):C調(diào)用Lua,本文講解了C調(diào)用Lua基礎(chǔ)知識、table操作、調(diào)用Lua函數(shù)等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua判斷數(shù)據(jù)類型的方法

    Lua判斷數(shù)據(jù)類型的方法

    這篇文章主要介紹了Lua判斷數(shù)據(jù)類型的方法,本文講解了判斷數(shù)據(jù)類型的方法和Lua腳本語言的8種基本數(shù)據(jù)類型,需要的朋友可以參考下
    2015-04-04
  • Lua源碼中字符串類型的實現(xiàn)

    Lua源碼中字符串類型的實現(xiàn)

    與其他主流腳本語言不同的是,Lua在實現(xiàn)字符串類型有兩方面不同。第一,所有的字符串在Lua中都只儲存一份拷貝。第二,所有的字符串變量,只保存字符串引用,而不保存它的buffer。我們來具體看看lua源碼中如何實現(xiàn)字符串類型的吧
    2015-04-04
  • 在Lua中使用模塊的基礎(chǔ)教程

    在Lua中使用模塊的基礎(chǔ)教程

    這篇文章主要介紹了在Lua中模塊的基本使用方法,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • 舉例簡介Lua中函數(shù)的基本用法

    舉例簡介Lua中函數(shù)的基本用法

    這篇文章主要介紹了舉例簡介Lua中函數(shù)的基本用法,--兩個橫線開始單行的注釋,--[[加上兩個[和]表示多行的注釋--]],需要的朋友可以參考下
    2015-07-07
  • Lua中的變量與賦值方法

    Lua中的變量與賦值方法

    今天小編就為大家分享一篇關(guān)于Lua中的變量與賦值方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Lua實現(xiàn)正序和倒序的文件讀取方法

    Lua實現(xiàn)正序和倒序的文件讀取方法

    這篇文章主要介紹了Lua實現(xiàn)正序和倒序的文件讀取方法,本文講解使用table生成鏈表完成正序和倒序的文件讀入功能,需要的朋友可以參考下
    2015-04-04
  • 使用lua實現(xiàn)split字符串分隔

    使用lua實現(xiàn)split字符串分隔

    Lua腳本可以很容易的被C/C++代碼調(diào)用,也可以反過來調(diào)用C/C++的函數(shù),這使得Lua在應(yīng)用程序中可以被廣泛應(yīng)用。不僅僅作為擴展腳本,也可以作為普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和維護(hù)。
    2014-11-11
  • Lua腳本語言入門筆記

    Lua腳本語言入門筆記

    這篇文章主要介紹了Lua腳本語言入門筆記,本文講解了什么是Lua、Lua里的注釋、Lua里的變量、Lua里的運算符、Lua里的數(shù)據(jù)類型、Lua里的代碼塊、Lua里的關(guān)系類型、Lua里的函數(shù)、Lua里的類等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • Lua教程(五):C/C++操作Lua數(shù)組和字符串示例

    Lua教程(五):C/C++操作Lua數(shù)組和字符串示例

    這篇文章主要介紹了Lua教程(五):C/C++操作Lua數(shù)組和字符串示例,本文同時還講解了如何在C/C++函數(shù)里面存儲Lua狀態(tài),需要的朋友可以參考下
    2014-09-09

最新評論

建始县| 丰县| 东源县| 宝丰县| 屏南县| 灵武市| 三明市| 朝阳市| 云和县| 信阳市| 和龙市| 青阳县| 桂东县| 景东| 仁寿县| 白朗县| 高要市| 兴国县| 韶山市| 神池县| 姚安县| 乡宁县| 莆田市| 衡阳县| 萨嘎县| 新源县| 南涧| 城市| 虹口区| 永安市| 固镇县| 琼海市| 屏边| 灌南县| 常熟市| 达拉特旗| 洛浦县| 安龙县| 邵阳市| 鄄城县| 高邑县|