C LuaJIT指针和垃圾收集
我试图完全理解LuaJIT的垃圾收集器将如何处理FFI,以及我必须手动管理的内容,因此我确信不会发生泄漏 阅读有关垃圾收集器的文章,以下断言是否正确:C LuaJIT指针和垃圾收集,c,pointers,lua,garbage-collection,luajit,C,Pointers,Lua,Garbage Collection,Luajit,我试图完全理解LuaJIT的垃圾收集器将如何处理FFI,以及我必须手动管理的内容,因此我确信不会发生泄漏 阅读有关垃圾收集器的文章,以下断言是否正确: 如果使用ffi.new('float[?]”,n)分配数组,那么gc可以跟踪其引用并根据需要进行收集 使用ffi.malloc(sizeof('float[n]'))必须手动处理,如ffi.free或提供“终结器”,如local p=ffi.gc(ffi.malloc(sizeof('float[n]')),ffi.free) 如果加载了ffi.
ffi.new('float[?]”,n)
分配数组,那么gc可以跟踪其引用并根据需要进行收集ffi.malloc(sizeof('float[n]'))
必须手动处理,如ffi.free或提供“终结器”,如local p=ffi.gc(ffi.malloc(sizeof('float[n]')),ffi.free)
float*示例(void)代码>和库被加载到命名空间Ex
中,然后在
local ptr=Ex.example()
ptr
正在存储指针,当不存在对ptr的引用时,gc将
收集ptr
内存是否会泄漏
ffi.gc(ptr,ffi.free)
让垃圾收集器知道ptr实际上是一个指针,当ptr本身没有引用时,它指向的内存可以被回收在本例中,他是否只是指对
ffi.free
的函数调用?如果是这样的话,ffi.new
将如何规避这一开销?1-是,2-是,3-是,4-不完全正确ffi.gc(some\u cdata,user\u func)
在上次引用消失时只调用user\u func(some\u cdata)
。您可以使用此选项自动释放内存。或者根据您的函数进行其他操作。任何用户函数调用都是昂贵的。@EgorSkriptunoff谢谢您的回答。我以为这已经死了。不管怎样,按照第(4)条的方式思考似乎没有危险,对吗?例如,函数New_Array(size)local ptr=ffi.cast('float*',ffi.malloc(ffi.sizeof(float)*size))返回ffi.gc(ptr,ffi.free)end
可以隐藏所有内容,最终用户会认为Lua是一种与Python类似的带有数组的动态语言(当然,在malloc保留陈旧数据时,这会有一些奇怪的行为,但是在没有new()消除C命名空间中未缓存的函数的开销?或者,您知道ffi.gc是否如Mike Pall多年前在我的问题中的链接中所说的那样在最新的LuaJIT版本中编译?使用ffi.C.malloc
而不是本机优化的ffi.new
,关于ffi.gc的好处是什么e> JIT编译了吗?你最好问问迈克。