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

mal*_*rbo 4 rust trait-objects

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

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

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

She*_*ter 5

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

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

相反,您可以选择使用特征对象,该对象创建代码的单个实现(for &Trait).


这些方法是作为RFC 640的一部分添加的,但讨论似乎没有提到这方面.实际上,它们最初是使用静态调度实现的.只是后来他们改为接受一个特质对象:

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

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