3

そのため、Lua C API を使用すると、Lua の値をレジストリに保存して、後で取得できます。それにはさまざまな方法があります。変数を作成し、そのポインタをレジストリのキーとして使用できます。これは常に一意であるためです。ポインターを軽いユーザーデータとしてプッシュします。

を使用して参照を作成することもできますLuaL_ref(L, LUA_REGISTRYINDEX)。一方が他方よりも優れている点は何ですか? いつ参照を使用し、いつポインタを使用するのですか?

また、参照については、参照と呼ぶように、Lua ガベージ コレクタが Lua の値を収集すると、レジストリ内の値は になりますnilか? Lua が Lua の値を更新すると、レジストリの値も変更されますか?

4

2 に答える 2

2

前の回答に加えて:

lightuserdataLuaとの違いuserdata

lightuserdataC ポインターを含む特別な Lua 型 (および、 、nilbooleanなどnumber)です。これ以上何もない。にメタテーブルを割り当てることはできません。逆に、メタテーブルをtype に割り当てることができます。たとえば、Lua File operationsを参照してください。ここで、ファイル ハンドルはメソッドと一緒です。f はコマンドと同等ですstringtablethreadlightuserdatauserdatauserdataf:read("*all")userdataf.read(f, "*all")

LUA_REGISTRYINDEX整数または C ポインタによるインデックス付け

レジストリ テーブルで広く使用されている 2 つの方法があります。

  1. で Lua 値への新しい参照を作成しluaL_ref、戻り整数値をコードのどこかに保存します。つまり、Lua 値にアクセスするには、参照とインデックス レジストリ テーブルを保持する C 変数を読み取る必要があり、lua_rawgeti(L, LUA_REGISTRYINDEX, i)その整数値はどこにありますか。lua_rawseti(L, LUA_REGISTRYINDEX, i)も可能ですが、このメソッドで nil 値に書き換えないでください!

  2. 静的 C 変数を作成してから、格納された Lua 値を簡単に操作するためにandstatic int myvar;を使用します。lua_rawgetp(L, LUA_REGISTRYINDEX, &myvar)lua_rawsetp(L, LUA_REGISTRYINDEX, &myvar)

残念ながら、両方の方法のパフォーマンスを比較することはできません。ほとんど同じだと思います。

于 2016-10-23T00:43:01.373 に答える