gpt4 book ai didi

pointers - 如何使用 LuaJIT FFI 创建指向现有数据的指针?

转载 作者:行者123 更新时间:2023-12-04 23:50:17 26 4
gpt4 key购买 nike

我知道有一些使用 LuaJIT FFI 创建指针的示例,但其中大多数都没有指向现有数据。一个这样的例子是这里:
How to pass a pointer to LuaJIT ffi to be used as out argument?

我无法成功做的一件事是创建一个指向现有值的指针。据我所知,为了有一个指针类型,我必须知道我希望在将来的某个时候有一个指向它的指针,如:

local vao = ffi.new("GLuint[1]")
gl.GenVertexArrays(1, vao)
gl.BindVertexArray(vao[0])

在这里,我知道 glGenVertexArrays 需要一个指向 vao 的指针。 ,所以我将其指定为 GLuint[1]。在 C 中,我将执行以下操作:
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

在这里,我不知道我需要指向 vao 的指针。 ,所以我可以正常指定它。

换句话说,有没有办法获取现有值的地址或创建指向现有值的指针?在创造值(value)之前,我是否必须预见我将如何处理值(value)?

谢谢!

最佳答案

无法获取 cdata 对象地址的原因是所有 cdata 对象都被垃圾回收。如果你停下来思考一下它的逻辑结论,你会发现这意味着它们必须分配在 Lua 堆上,而不是 malloc 的一般 C 堆上。会用。只将指针返回到 Lua 堆中是非常不安全的,因为垃圾收集器可能随时出现并移动对象。

这样做的一个后果是你绝对不应该做 rraallvv 建议的事情,因为你可能会导致段错误。

当您调用 ffi.new("GLuint[1]")你分配了一个数组 GLuint s 在 Lua 堆上(LuaJIT 称之为“引用”类型)这没关系,因为当你调用 GenVertexArrays() 时(1) GC 无法运行,因为您正忙于执行 C 代码,(2) GenVertexArrays()不保留指针,因此您不必担心稍后会访问过时的指针。

但是,LuaJIT 的 FFI 提供了足够的功能,我们可以构建自己的分配装置。下面的代码应该(还没有完全测试过这个版本)在 C 堆上分配数据并安装一个默认的终结器来释放它。如果您查看所有使用的 FFI 函数,您应该对事物有更好的了解。

local function SafeHeapAlloc(typestr, finalizer)
-- use free as the default finalizer
if not finalizer then finalizer = ffi.C.free end

-- automatically construct the pointer type from the base type
local ptr_typestr = ffi.typeof("$ *", typestr)

-- how many bytes to allocate?
local typesize = ffi.sizeof(typestr)

-- do the allocation and cast the pointer result
local ptr = ffi.cast(ptr_typestr, ffi.C.malloc(typesize))

-- install the finalizer
ffi.gc( ptr, finalizer )

return ptr
end

关于pointers - 如何使用 LuaJIT FFI 创建指向现有数据的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24112779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com