作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 OCaml 中的外部声明编写 C 库的接口(interface)。我使用 ctypes 进行测试,但它涉及 100% 的快速调用开销(通过 core_bench 微基准测试测量)。
函数如下所示:
/* external _create_var : float -> int -> int -> int -> _npnum = "ocaml_tnp_number_create_var" ;; */
value ocaml_tnp_number_create_var(value v, value nr, value p, value o) {
//CAMLparam4(v, nr, p, o);
const int params = Int_val(p);
const int order = Int_val(o);
const int number = Int_val(nr);
const double value = Double_val(v);
return CTYPES_FROM_PTR(tnp_number_create_variable(value, number, params, order));
}
/* external _delete : _npnum -> unit = "ocaml_tnp_number_delete" ;; */
value ocaml_tnp_number_delete(value num) {
//CAMLparam1(num);
struct tnp_number* n = CTYPES_TO_PTR(num);
tnp_number_delete(n);
return Val_unit;
}
我借用了 CTYPES_* 宏,所以我基本上是将指针作为 Int64 值移动。
#define CTYPES_FROM_PTR(P) caml_copy_int64((intptr_t)P)
#define CTYPES_TO_PTR(I64) ((void *)Int64_val(I64))
#define CTYPES_PTR_PLUS(I64, I) caml_copy_int64(Int64_val(I64) + I)
据我所知,这些值表示为标记为“自定义”的框,GC 应保持不变。
我是否需要取消对 CAMLparamX
宏的注释以通知 GC 我的使用情况或者忽略它们是否合法?
最佳答案
根据byterun/memory.h
中的评论您的函数必须以包含所有value
参数的CAMLparamN
宏开头。
关于c - 什么时候需要 CAMLparamX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21930764/
我正在使用 OCaml 中的外部声明编写 C 库的接口(interface)。我使用 ctypes 进行测试,但它涉及 100% 的快速调用开销(通过 core_bench 微基准测试测量)。 函数如
我是一名优秀的程序员,十分优秀!