gsbind
概述
gsbind
不是一个插件,gsbind
是一个轻量级的头文件库,用于支持以非ffi
的方式进行gs
向C/C++
的跨语言函数调用。
提示:
gsbind
仅包含两个头文件,gsbind.h
与memory_mgr.h
。于项目gsbind
下获取。
对比FFI
gsbind
性能优势的核心在于 “将 FFI
的运行时成本转移到编译时”:
gsbind
充分利用了C++的模板和元编程特性,在编译期完成 了大量传统 FFI 在运行时才执行的工作,当通过 gsbind 声明绑定代码时,这些模板会在编译时实例化并生成针对特定类型和函数的、高度优化的跨语言调用代码。
FFI
相对于 gsbind
的优势在于其不需要侵入修改 C++ 代码, 无需源码和编译,快速集成相应动态库。
FFI
需要在运行时动态查找函数符号、解析函数签名、确定参数类型和调用约定等,相对于 gsbind
具有额外开销。
gsbind 与 FFI 对比总览表
对比维度 | gsbind | FFI |
---|---|---|
实现机制 | 基于 C++ 模板元编程,编译时生成绑定代码,自动映射 C++ 函数到 gs efun | 运行时动态加载动态库(.so /.dll ),需手动声明函数签名与数据类型 |
开发体验 | 🔧 中等复杂度:需编译绑定代码,但语法简洁(声明式绑定) | 🚀 快速上手:无需编译,直接调用现有库,适合快速原型 |
适用场景 | 高性能计算, 需复杂交互(如操作gs复杂数据类型) | 调用闭源动态库,快速原型验证,轻量级跨语言集成 |
性能 | ⭐⭐⭐⭐ 接近原生 C++:调用无运行时解析开销 | ⭐⭐ 固定调用开销:每次调用需跨语言边界,参数转换耗时 |
可变参数函数 | ❌ 当前不支持,后续版本实现 | ✅ 完整支持C++可变参数函数 |
OS_PENDING_CALL | ❌ 当前不支持,后续版本实现 | ✅ ffi调用完全支持 |
复杂结构值传递 | ❌ 当前不支持,后续版本尝试实现 | ✅ ffi调用支持传递struct |
高级功能支持 | ❌ 当前不支持,后续版本实现 gs 的 array, map 等复杂数据类型操作支持 | ❌ 仅基础函数调用 |
gsbind支持: 当前gsbind为基础验证版本,仅支持基本函数调用功能,后续会进一步开发支持。
可变参数:当前版本若要使用如 pkg:hiredis 中的 redisCommand 函数的可变参数功能,请优先使用 ffi。gsbind会在后续进行支持。
pend调用:当前版本若要使用如 pkg:mongoc 中的 OS_PENDING_CALL 功能请优先使用 ffi。gsbind会在后续进行支持。
值传递限制:当前版本若要使用如 pkg:hiredis 中的 redisSetTimeout 函数进行值传递 struct timeval 等struct或复杂类型请优先使用 ffi。gsbind会在后续尝试进行支持。
注意事项
名称要求: 要求生成的动态库命名与 INIT_MODULE(module_name) 声明的 module_name 名称一致
内存管理: gsbind 默认注册 gs 的内存管理函数
参数传递: struct,class 等类型数据请以 C++ 指针传递
宏简介
此处简单介绍下基本的 C++ 侧 gsbind 支持必须的宏。
-
INIT_MODULE(module_name)
- 该宏会声明和定义内存管理器必要的函数或变量
- 该宏会声明,定义并导出 module_init_##module_name 和 module_shutdown_##module_name 函数
- 该宏以module用于注册函数的函数声明
void detail::module_def_funcs(ModuleHolder* m)
作为结尾
-
DEFINE_FUNC(ret_type, func, name, arguments, doc)
- 该宏用于调用
void def(Func&& f, const char* name, const char* prototype, const char* doc)
添加注册函数 - 以
int add(int i, int j)
函数为例, DEFINE_FUNC 应声明为DEFINE_FUNC(int, add, add, (int i, int j), "Add func");
- 注意 ret_type 和 arguments 中的类型应为gs类型而不是C++类型
- 该宏用于调用
-
DEFINE_FUNC_SIMPLE(ret_type, name, arguments)
- 功能同DEFINE_FUNC,会将
prototype
参数直接作为doc
参数传入
- 功能同DEFINE_FUNC,会将
-
DEFINE_FUNC_LAZY(name)
- 功能同DEFINE_FUNC, 函数原型的
prototype
参数由模板展开自动获取,prototype
参数直接作为doc
参数传入
- 功能同DEFINE_FUNC, 函数原型的
-
由于 C++ 函数类型信息中没有参数名称,以
DEFINE_FUNC_LAZY
定义的函数参数列表会被替换为 arg1,arg2... -
类成员函数已支持,定义方式形如
DEFINE_FUNC_LAZY(Class::get_a);