2016-05-24 39 views
4

这些方法使用动态调度(接收的性状对象&Debug作为参数):为什么一些std :: fmt :: Debug *方法使用动态分派?

种这些方法使用静态调度和被写入相关entry方法方面:

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

回答

5

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

如果您有使用许多具体类型的功能,你可能会招致在编译时创建并优化所有这些版本的大损失。即使在这些情况下单态化不会增加性能,也会发生这种情况。

取而代之,您可以选择使用trait object,这会创建一个代码实现(对于&Trait)。


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

重组调试建设者,以尽量减少代码生成

从通用范围切换到特质的对象,并具有非内联 内方法应该减少调试impls的大小,因为我们关心 关于一个Debug实现方式的速度不如二进制膨胀。

相关问题