rust - 什么时候应该使用函数指针而不是闭包?
问题描述
我的理解是,实现一个以 animpl Fn
作为参数的函数允许 rust 编译器执行更多优化,但使用 animpl Fn
而不是函数指针不应该更具限制性。我还可以将函数指针传递给接受 的函数impl Fn
,所以我猜测 Rust 中的函数指针类型仅可用作PhantomData
表达类型差异的通用参数,在 ffi 中以及在某些情况下作为Box<dyn Fn(...) -> ...>
.
解决方案
impl Fn
类型基本上隐藏了类型参数。使函数成为泛型函数的任何类型参数都需要为传入的每个不同类型重新编译(单态化)函数。因此,与仅采用具体类型(例如,此处的函数指针)的非泛型函数相比,泛型函数会导致更长的编译时间和更多生成的代码。因此,您可以使用函数指针来减少项目的总编译时间或二进制文件的大小。如果您需要存储提供的函数,
impl Fn()
则意味着将其放入 aBox<dyn Fn()>
中,并通过 vtable 调用它。这是比直接调用函数指针多一种间接方式(多一种内存访问)。函数指针可以直接存储在数据结构中,例如Vec<fn(&mut Foo)>
.(但这并不意味着
Box
将执行分配;如果函数类型不是捕获闭包(相当于“可以强制为函数指针”),那么它是零大小的类型,因此Box
不分配。)正如您已经注意到的,函数指针出现在 FFI 中是因为它们是预期的 ABI,而
impl Fn
ordyn Fn
是特定于 Rust 的。
推荐阅读
- sql - 按时间段对数据进行分类
- flutter - 我在 dart lang 上有一个相同值的列表。我怎样才能得到他们的每一个索引?
- xcode - 如何将文件从沙盒应用程序正确复制到应用程序脚本文件夹?
- android - 如何为 Android 应用程序的延迟调试做准备
- flutter - Flutter 项目构建失败
- kotlin-multiplatform - Kotlin Js - 访问资源文件夹
- python - 获取bubblesort python的索引和值
- pdf - iText 7个汉字并与现有的pdf模板合并
- java - 如何在使用spring集成从sftp移动到本地目录时将不同的文件保存到不同的位置
- android - Ionic 4 Deeplinking - 如果未安装应用程序,则启动网站