Rust 中的多态与内存管理
1. 基于特征对象的真正多态
Rust 允许通过实现特征的特殊类型形式来实现真正的多态,这些类型被称为特征对象。在解释 Rust 如何使用特征对象实现多态之前,我们需要理解调度的概念。
1.1 调度
调度是从面向对象编程范式中出现的一个概念,主要与多态这一特性相关。在面向对象编程中,当 API 是泛型的或者接受实现了某个接口的参数时,它必须确定要对传递给 API 的类型实例调用哪个方法实现。在多态上下文中,这种方法解析的过程称为调度,调用方法则称为分派。在支持多态的主流语言中,调度可以通过以下两种方式发生:
- 静态调度 :当要调用的方法在编译时确定时,称为静态调度或早期绑定。使用方法的签名来决定要调用的方法,所有这些都是在编译时决定的。在 Rust 中,泛型体现了这种调度形式,因为即使泛型函数可以接受许多参数,但在编译时会为具体类型生成该函数的专门副本。
- 动态调度 :在面向对象语言中,有时直到运行时才能确定方法调用。这是因为具体类型是隐藏的,只能调用该类型的接口方法。在 Java 中,当函数有一个接口类型的参数时就是这种情况。这种场景只能通过动态调度来处理。在动态调度中,通过遍历虚表(vtable)中的接口实现列表并调用相应方法来动态确定要调用的方法。虚表是一个函数指针列表,指向每个类型实现的方法。由于方法调用中额外的指针间接引用,这会带来一些开销。
1.2 特征对象
到目前为止,我们主要看到特征在静态调度上下文中使用,即在泛型 API 中指定特征边界。然而,我们还有另一种创建多态 API 的方法,即可
Rust中的多态与内存管理详解
超级会员免费看
订阅专栏 解锁全文
2002

被折叠的 条评论
为什么被折叠?



