我的理解是实现一个需要 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 Fn
或dyn Fn
是 Rust 特定的。
关于rust - 什么时候应该使用函数指针而不是闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69635413/