2016-05-24 2 views
4

Эти методы используют динамическую отправку (получение объекта признака &Debug в качестве параметра):Почему некоторые методы std :: fmt :: Debug * используют динамическую отправку?

Эти методы используют статические отправки и записываются в терминах соответствующего entry метода:

Почему первый список методов использования динамической диспетчеризации вместо статическая отправка? Если статическая отправка была использована, будет ли их использование ограничено?

ответ

5

Статическая отправка использует monomorphization, что создает отдельную копию кода для каждого конкретного типа.

Если у вас есть функция, которая используется с конкретными типами , вы можете понести большой штраф во время компиляции для создания и оптимизации всех этих версий. Это произойдет, даже если мономорфизация не добавит производительности в этих случаях.

Вместо этого вы можете использовать trait object, который создает единую реализацию кода (для).


Эти методы были добавлены в рамках RFC 640, но discussion, кажется, не говоря уже этот аспект. Фактически, они были originally implemented with static dispatch. Только позже они были changed to accept a trait object:

Restructure отладочные строителей, чтобы минимизировать Codegen

Переход от общих границ к Черта объектов и имеющих не-встраиваемыми внутренние методы должны сократить размер отладки impls, так как мы заботимся о скорости пути реализации отладки меньше бинарного раздувания.