Keyword dyn

source ·
Expand description

dyntrait 对象 类型的前缀。

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 / 泛型参数小的代码,因为该方法不会针对每种具体类型重复。