4

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

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

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

4

1 回答 1

5

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

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

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


这些方法是作为RFC 640的一部分添加的,但讨论似乎没有提到这方面。事实上,它们最初是用静态调度实现的。直到后来他们才被更改为接受一个 trait 对象

重组调试构建器以最小化代码生成

从通用边界切换到 trait 对象并使用未内联的内部方法应该会减少 Debug 实现的大小,因为我们关心 Debug 实现的速度不如二进制膨胀。

于 2016-05-24T15:36:41.403 回答