rust - 什么时候应该使用函数指针而不是闭包?

标签 rust closures function-pointers

我的理解是实现一个需要 impl Fn 的函数作为参数允许 rust 编译器执行更多优化,但使用 impl Fn而不是函数指针不应该受到更多限制。 我还可以将函数指针传递给接受 impl Fn 的函数。 ,所以我猜测 Rust 中的函数指针类型仅作为 PhantomData 的通用参数有用。表达类型差异,在 ffi 中,在某些情况下作为 Box<dyn Fn(...) -> ...> 的替代.

最佳答案

  • impl Fn type 基本上隐藏了类型参数。任何使函数成为泛型函数的类型参数都需要针对传入的每个不同类型重新编译(单态化)该函数。因此,与仅采用具体类型(例如此处的函数指针)的非泛型函数相比,泛型函数会导致更长的编译时间和更多的生成代码。因此,您可以使用函数指针来减少项目的总编译时间或二进制文件的大小。

  • 如果您需要存储提供的函数,impl Fn()意味着将其放入 Box<dyn Fn()> ,并通过 vtable 调用它。这比直接调用函数指针多了一种间接(多了一种内存访问)。函数指针可以直接存储在数据结构中,例如Vec<fn(&mut Foo)> .

    (但这并不意味着 Box 将执行分配;如果函数类型不是捕获闭包(相当于“可以强制为函数指针”),那么它是零- 大小的类型,因此 Box 不会分配。)

  • 正如您已经指出的,函数指针出现在 FFI 中是因为它们是预期的 ABI,而 impl Fndyn Fn是 Rust 特定的。

关于rust - 什么时候应该使用函数指针而不是闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69635413/

相关文章:

rust - 如何将编译期间命令行上提供的字符串编译成我的 Rust 二进制文件?

rust - 如何为通用结构实现默认值?

rust - 是否有自动将箱子添加到我的 Cargo.toml 的命令?

c - 我只能调用一个函数一次来使用指针比较两个数字

loops - 如何改变我正在循环的结构?

javascript - 如何使用闭包调用 Javascript 函数?

javascript - Javascript 中的闭包混淆

javascript - LexicalEnviroment 对象和 [[Environment]] 之间的关系

c++ - 函数返回数组中最大元素的地址

c - 未定义引用?但是我已经实现了这个功能