我在CFFI中包含了C ++ vector<int>
的这些C绑定。
我知道如何使用vector<int>
创建std_carrayTovector
并使用int
将数据转换回std_vectorToCArray
指针,以便我可以使用Lisp从中检索数据CFFI函数MEM-AREF
。我为下面写了正确的defcfun
。
我的问题是:如何将defcfun
的{{1}}的输出转换为Lisp向量(例如std_vectorToCArray
)并使其成为O(1)操作 - 即全部数据同时复制。
#(1 2 3)
答案 0 :(得分:0)
我还没试过这个,但我认为以下内容应该有效。关于std::vector
我们可以使用的重要一点是,它保证有一个诚实的上帝阵列支持。也就是说,& my_vector [0]
指向my_vector
对象的数组。 (当然,这不仅适用于std::list
或其他任何事情)
所以你要做的就是创建一个CFFI可以调用的函数(在你的C ++代码中),它返回一个指向向量开头的指针。大概是这样的:
extern "C"
Foo*
start_of_foo_vector (std::vector<Foo> vec)
{
return & vec[0];
}
您需要extern "C"
,因此您不必担心名称错误。当然,您必须为每种类型编写不同的功能(并且不能使用extern "C"
的模板,我不这么认为。
在下次修改向量之前,您获得的指针有效。