这些方法使用动态分派(接收特征对象&Debug
作为参数):
这些方法使用静态分派,并根据相关的entry
方法编写:
为什么第一个方法列表使用动态分派而不是静态分派?如果使用静态调度,它们的使用会受到限制吗?
答案 0 :(得分:5)
静态分派使用单态化,这会导致为每种具体类型创建单独的代码副本。
如果有一个与许多具体类型一起使用的函数,则在编译时可能会产生很大的损失,以创建和优化所有这些版本。即使单态化在这些情况下没有增加性能,也会发生这种情况。
相反,您可以选择使用trait object,它会创建代码的单个实现(对于&Trait
)。
这些方法是作为RFC 640的一部分添加的,但discussion似乎并未提及此方面。事实上,他们是originally implemented with static dispatch。他们后来只有changed to accept a trait object:
重组调试构建器以最小化codegen
从通用边界切换到特征对象并具有非内联 内部方法应该减少Debug impls的大小,因为我们关心 关于Debug实现方式的速度低于二进制膨胀。