403
京東網上商城
Lua數據結構 — TValue(一)
作者:羅日健
數據結構的設計,在一定程度上奠定了整個係統的設計,所以決定寫一個對Lua主要數據結構的分析文章,本來打算寫一篇就好了,但是每個數據類型其實都有點複雜,一篇的話篇幅太長,所以就拆開幾篇來寫了。
為什麼是從TValue說起,TValue是實現Lua弱數據類型的主要數據結構,不但在腳本中的值使用了TValue,連Lua的實現中,很多數據結構也依賴於TValue,TValue一定程度上貫穿了整個Lua。先說一下Lua裏麵的數據類型:(lua.h :69)
從上麵的定義中可以看到,Lua的值類型有9種,其中LUA_TNONE是用於判斷這個變量是否等於為空使用的,這個是Lua內部使用的,後麵再詳細說明。現在來看Lua裏麵的TValue數據結構:(lobject.h 71-75)
在Lua裏麵,一個變量使用TValue這個類型來存儲的,int tt就是上麵宏的類型值(4個字節),而Value則是一個union(8個字節)。在這個union中,其實分工也十分明確:
在Value中,void* p、lua_Number n、int b都是不用回收的值類型,而GCObject* gc則都是需要回收的對象,下麵是GCObject數據結構:(lstate.h 133-145)
GCObject也是一個union,存儲了一個GCheader,這個GCHeader主要用於GC回收機製使用,GC回收機製超出了這次討論話題,暫時先忽略。真正存儲值的結構是TString、Udata、Closure等等,每個存儲數據的結構都會有GCheader,接下來幾篇文章將會開始逐個數據類型進行解釋。
最後更新:2017-04-03 08:26:25