dyn 和 impl都是用于多态的,后面跟的都是一个trait,比如,我们有一个trait Shape

  1. trait Shape {
  2. fn area(&self) -> u64
  3. }
  4. trait Shape {
  5. fn area(&self) -> u64
  6. }
  7. impl Shape for Rectangle {
  8. fn area(&self) -> u32 {
  9. self.x * self.y
  10. }
  11. }

dyn

  1. fn dyn_dispatch(t: &dyn Shape) {
  2. println!("area is {}", t.area());
  3. }

dyn 是dynamic dispatch,发生在运行态,会创建一个trait object,这个trait object是一个fat object,其中一个指针指向传入的对象,vtable指向trait的method table,如果实际传入的对象只有在runtime才知道,那么只能用dyn,这会带来一点性能上的开销

image.png

impl

  1. fn static_dispatch(t: &impl Shape) {
  2. println!("area is {}", t.area());
  3. }

impl 发生在compile time,也就是说rust会首先将 &impl Shape 换成实际的类型,这样在运行时没有额外的开销,所以优先使用 impl

reference

impl vs dyn