[英]What is the difference between Lua registry with light userdata and references?
因此,使用 Lua C API,您可以在注冊表中保存 Lua 值並在以后檢索它。 有不同的方法可以做到這一點,您可以創建一個變量並將它的指針用作注冊表中的鍵,因為它始終是唯一的。 您可以將指針作為輕用戶數據推送。
您還可以使用LuaL_ref(L, LUA_REGISTRYINDEX)
創建引用。 一個比另一個有什么優勢? 何時使用引用,何時使用指針?
還有引用,因為它被稱為引用,如果 Lua 垃圾收集器收集 Lua 值,注冊表中的值會是nil
嗎? 如果 Lua 更新了 Lua 值,注冊表中的值是否也會改變?
Lua 注冊表只是另一個 lua 表,可以通過預定義的“特殊”索引輕松訪問。 我想你不需要解釋 Lua 表與輕用戶數據的不同之處。
您將如何索引注冊表並不重要,只要您可以將該鍵存儲在 C/C++ 端即可。 為了您的方便,已經有函數 (luaL_ref/luaL_unref) 為您提供易於存儲和移動的整數鍵。
關於垃圾收集 - 規則始終相同。 只要值存儲在未標記為弱表(注冊表不是弱表)的表中,該值就不會被清除。 您必須從注冊表中明確刪除值。
更改值將遵循正常的 Lua 規則。 將新的不可變值分配給某個變量不會改變存儲在注冊表中的值,即注冊表不會跟蹤某個變量的更新。 但是更改可變值(表等)的內容是可以的,因為注冊表和變量將引用相同的值。
除了之前的答案:
lightuserdata
和userdata
區別 lightuserdata
是包含 C 指針的特殊 Lua 類型(以及nil
、 boolean
、 number
、 string
、 table
、 thread
等)。 沒有更多了。 您不能將元表分配給lightuserdata
。 相反,你可以分配到元表userdata
類型。 例如看到Lua的文件操作,其中的文件句柄是userdata
與方法。 f:read("*all")
f 是userdata
命令等價於f.read(f, "*all")
LUA_REGISTRYINDEX
注冊表中有兩種廣泛使用的方法。
使用luaL_ref
創建對 Lua 值的新引用,並將返回的整數值存儲在代碼中的某處。 即要訪問 Lua 值,您需要使用lua_rawgeti(L, LUA_REGISTRYINDEX, i)
讀取包含引用和索引注冊表的 C 變量lua_rawgeti(L, LUA_REGISTRYINDEX, i)
其中該整數值在哪里。 lua_rawseti(L, LUA_REGISTRYINDEX, i)
也是可能的,但不要嘗試用這種方法重寫為 nil 值!
您創建了一個靜態 C 變量static int myvar;
然后使用lua_rawgetp(L, LUA_REGISTRYINDEX, &myvar)
和lua_rawsetp(L, LUA_REGISTRYINDEX, &myvar)
直接操作存儲的 Lua 值。
不幸的是,我無法比較這兩種方法的性能。 我認為它們幾乎相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.