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

Why do some std::fmt::Debug* methods use dynamic dispatch?

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

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

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

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

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

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


这些方法是作为 RFC 640, but the discussion doesn't seem to mention this aspect. In fact, they were originally implemented with static dispatch. Only later were they changed to accept a trait object 的一部分添加的:

Restructure debug builders to minimize codegen

Switching from generic bounds to trait objects and having un-inlined inner methods should cut down on the size of Debug impls, since we care about the speed of a Debug implementation way less than binary bloat.