簡體   English   中英

Lua 注冊表與輕用戶數據和引用之間有什么區別?

[英]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 規則。 將新的不可變值分配給某個變量不會改變存儲在注冊表中的值,即注冊表不會跟蹤某個變量的更新。 但是更改可變值(表等)的內容是可以的,因為注冊表和變量將引用相同的值。

除了之前的答案:

Lua lightuserdatauserdata區別

lightuserdata是包含 C 指針的特殊 Lua 類型(以及nilbooleannumberstringtablethread等)。 沒有更多了。 您不能將元表分配給lightuserdata 相反,你可以分配到元表userdata類型。 例如看到Lua的文件操作,其中的文件句柄是userdata與方法。 f:read("*all") f 是userdata命令等價於f.read(f, "*all")

使用整數或 C 指針索引LUA_REGISTRYINDEX

注冊表中有兩種廣泛使用的方法。

  1. 使用luaL_ref創建對 Lua 值的新引用,並將返回的整數值存儲在代碼中的某處。 即要訪問 Lua 值,您需要使用lua_rawgeti(L, LUA_REGISTRYINDEX, i)讀取包含引用和索引注冊表的 C 變量lua_rawgeti(L, LUA_REGISTRYINDEX, i)其中該整數值在哪里。 lua_rawseti(L, LUA_REGISTRYINDEX, i)也是可能的,但不要嘗試用這種方法重寫為 nil 值!

  2. 您創建了一個靜態 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM