为什么有些 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.
这些方法使用动态调度(接收特征对象&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.