Expand description
dyn
是 trait 对象 类型的前缀。
dyn
关键字用于突出显示对关联 Trait
上的方法的调用是 dynamically dispatched。
要以这种方式使用 trait,它必须是对象安全的。
与泛型参数或 impl Trait
不同,编译器不知道要传递的具体类型。即,类型为 erased。
因此,dyn Trait
引用包含 two 指针。
一个指针指向该数据 (例如,结构体的实例)。
另一个指针指向方法名称为函数指针的 map (称为虚拟方法表或 vtable)。
在运行时,当需要在 dyn Trait
上调用方法时,将查询 vtable 以获取函数指针,然后调用该函数指针。
有关 trait 对象 和 对象安全 的更多信息,请参见引用。
Trade-offs
上面的间接调用是在 dyn Trait
上调用函数的额外运行时成本。
动态分配调用的方法通常不能由编译器内联。
但是,dyn Trait
可能会产生比 impl Trait
/ 泛型参数小的代码,因为该方法不会针对每种具体类型重复。