Dart FFI 究竟是如何实现的?它们是否与普通函数调用一样便宜,或者它们是否在引擎盖下进行繁重的工作?

How is Dart FFI implemented indeed? Are they as cheap as a normal function call, or do they do heavy lifting under the hood?

我对 Dart FFI 的实现方式很感兴趣。它们是否与普通函数调用一样便宜,还是它们在后台进行繁重的工作?

我在网上搜索过,但找不到太多信息。我只发现 this article 谈论了一些关于参数传递和 ABI 的见解。另外,我想它应该有一些保护,因为Dart有GC之类的东西,而C没有。

感谢任何提示!

Dart FFI 使用 C 的 dlopen() for platforms other than Windows (non-POSIX). It's a very lightweight interface to shared objects. Compiled shared objects contain a table with symbol names and their memory offset. The shared object is opened with dlopen() then specific contained items are found in memory using dlsym() 及其符号名称。这为名称为 'testDartFFI()' 的函数提供了内存地址。然后,dart 运行时可以使用内存地址调用此函数,使用 Dart 原型正确传递和基于 C 标准的 return 值。在开销方面,它与调用其他动态链接的系统库没有太大区别。