閱讀403 返回首頁    go 京東網上商城


Lua數據結構 — TValue(一)

作者:羅日健

數據結構的設計,在一定程度上奠定了整個係統的設計,所以決定寫一個對Lua主要數據結構的分析文章,本來打算寫一篇就好了,但是每個數據類型其實都有點複雜,一篇的話篇幅太長,所以就拆開幾篇來寫了。

為什麼是從TValue說起,TValue是實現Lua弱數據類型的主要數據結構,不但在腳本中的值使用了TValue,連Lua的實現中,很多數據結構也依賴於TValue,TValue一定程度上貫穿了整個Lua。先說一下Lua裏麵的數據類型:(lua.h :69)

lua-data-structure-1

從上麵的定義中可以看到,Lua的值類型有9種,其中LUA_TNONE是用於判斷這個變量是否等於為空使用的,這個是Lua內部使用的,後麵再詳細說明。現在來看Lua裏麵的TValue數據結構:(lobject.h 71-75)

lua-data-structure-2

在Lua裏麵,一個變量使用TValue這個類型來存儲的,int tt就是上麵宏的類型值(4個字節),而Value則是一個union(8個字節)。在這個union中,其實分工也十分明確:

3

在Value中,void* p、lua_Number n、int b都是不用回收的值類型,而GCObject* gc則都是需要回收的對象,下麵是GCObject數據結構:(lstate.h 133-145)

lua-data-structure-3

GCObject也是一個union,存儲了一個GCheader,這個GCHeader主要用於GC回收機製使用,GC回收機製超出了這次討論話題,暫時先忽略。真正存儲值的結構是TString、Udata、Closure等等,每個存儲數據的結構都會有GCheader,接下來幾篇文章將會開始逐個數據類型進行解釋。

lua-data-structure-4

 

最後更新:2017-04-03 08:26:25

  上一篇:go Lua數據結構 — TString(二)
  下一篇:go 高性能網絡編程7–tcp連接的內存使用