首页 > 解决方案 > 什么时候应该使用函数指针而不是闭包?

问题描述

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

标签: rustclosuresfunction-pointers

解决方案


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

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

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

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


推荐阅读