You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过Ruby FFI传递Ruby(C API) VALUE至函数?Numo::NArray场景

如何通过FFI传递Ruby对象的原始VALUE给Numo::NArray的C函数?

我最近在尝试做Numo::NArray和FFI的桥接,核心目标是让FFI的Pointer不用通过String复制数据就能直接访问Numo::NArray的原始内存——这样能避免GC波动和不必要的数据拷贝,性能会好很多。

我了解到Numo::NArray暴露了一个名为nary_get_pointer_for_read_write的C函数,而且Numo::FFTW已经在使用它了,但问题在于这个函数的参数是CRuby内部的VALUE类型,我至今没找到通过FFI传递这个VALUE的正确方式。

下面是我写的一段没法正常工作的代码草稿:

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, [:RAW_RUBY_VALUE_IF_FFI_CAN_DO_THIS], :pointer
  attach_function :nary_get_pointer_for_read_write, [:RAW_RUBY_VALUE_IF_FFI_CAN_DO_THIS], :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)

如果这种直接用FFI的方式走不通,我的下一步计划是自己写一个C扩展gem来做这个桥接,之后还打算考虑给numo-narray项目提交PR,直接添加一个能获取FFI指针的函数。

现在我想请教的是:是否可以通过FFI将Ruby对象的原始VALUE传递给绑定的C函数? 我已经查阅过这些资料但没找到答案:Ruby C扩展文档、Numo::NArray的相关公开issue、Numo::NArray的头文件定义、Numo::FFTW的源代码,还有Ruby FFI的类型文档。

内容的提问来源于stack exchange,提问作者nitrogen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:10:53