rust笔记11:虚拟方法表VTable 和 dyn
理解 Rust 中的 虚拟方法表(VTable) 和 dyn
的关键在于明确它们的用途和适用场景。为了更清晰地解释,我们从问题的根源出发:为什么需要动态分发? 以及 在什么场景下需要用到 VTable 和 dyn
?
1. 为什么需要 VTable 和 dyn
?
Rust 默认使用 静态分发(Static Dispatch),即在编译时确定调用哪个方法。这种方式效率高,但有一个限制:必须在编译时知道具体的类型。然而,在某些场景下,我们无法在编译时确定具体类型,而是需要在运行时根据条件决定调用哪个方法。这时就需要 动态分发(Dynamic Dispatch),而 VTable 和 dyn
就是实现动态分发的工具。
静态分发的局限性
以下是一个静态分发的例子:
trait Animal {
fn speak(&self);
}
struct Dog;
impl Animal for Dog {
fn speak(&self) {
println!("Woof!");
}
}
struct Cat;
impl Animal for Cat {
fn speak(&self) {
println!("Meow!");
}
}
fn make_animal_speak<T: Animal>(animal: &T) {
animal.speak(); // 静态分发:编译时确定调用哪个方法
}
fn main(