是否可以使用 Ruby FFI 将 Ruby (C API) VALUE 发送到函数?

问题描述

我目前正在尝试桥接 Numo::NArrayFFI,以便 FFI Pointer 可以访问 Numo::NArray 中的原始数据而无需 {{3} } (因此会导致 GC 流失和浪费额外的副本)。

有一个由 Numo::NArray 公开的 C 函数,名为 nary_get_pointer_for_read_write,这是 Numo::FFTWcopy data through String like I do now。但是,此函数的参数是 CRuby 的内部 VALUE 类型,我还没有找到使用 FFI 传递 VALUE 的方法。

这是我想尝试的非工作草稿。如果这不可能,我的下一步可能是编写另一个 C 扩展 gem 来进行桥接,然后可能尝试 PR 一个函数以将 FFI 指针引入 numo-narray 项目。

require 'numo/narray'
require 'ffi'

module NArrayFFI
  ffi_lib FFI::CURRENT_PROCESS
  attach_function :nary_get_pointer_for_read,[:RAW_RUBY_VALUE_IF_FFI_CAN_DO_THIS],:pointer
  attach_function :nary_get_pointer_for_write,:pointer
  attach_function :nary_get_pointer_for_read_write,:pointer
end

data = Numo::SFloat[1,2,3,4,5]
data_ptr = NArrayFFI.nary_get_pointer_for_read_write(data)
SomeOtherFFI.function_that_takes_pointer(data_ptr)

那么,是否可以将 Ruby 值的原始 VALUE 传递给使用 FFI 附加的函数?


以下是我迄今为止检查过的参考资料,没有答案,但可能对其他有类似问题的人有用:

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)