为什么有些std :: fmt :: Debug *方法使用动态调度?

时间:2016-05-24 15:27:07

标签: rust trait-objects

这些方法使用动态分派(接收特征对象&Debug作为参数):

这些方法使用静态分派,并根据相关的entry方法编写:

为什么第一个方法列表使用动态分派而不是静态分派?如果使用静态调度,它们的使用会受到限制吗?

1 个答案:

答案 0 :(得分:5)

静态分派使用单态化,这会导致为每种具体类型创建单独的代码副本。

如果有一个与许多具体类型一起使用的函数,则在编译时可能会产生很大的损失,以创建和优化所有这些版本。即使单态化在这些情况下没有增加性能,也会发生这种情况。

相反,您可以选择使用trait object,它会创建代码的单个实现(对于&Trait)。

这些方法是作为RFC 640的一部分添加的,但discussion似乎并未提及此方面。事实上,他们是originally implemented with static dispatch。他们后来只有changed to accept a trait object

  

重组调试构建器以最小化codegen

     

从通用边界切换到特征对象并具有非内联   内部方法应该减少Debug impls的大小,因为我们关心   关于Debug实现方式的速度低于二进制膨胀。