Почему некоторые методы std::fmt::Debug* используют динамическую диспетчеризацию?
Эти методы используют динамическую диспетчеризацию (получают объект признака &Debug
как параметр):
DebugMap::entry
DebugSet::entry
DebugStruct::field
DebugTuple::field
DebugList::entry
Эти методы используют статическую диспетчеризацию и написаны в терминах entry
метод:
DebugMap::entries
DebugSet::entries
DebugList::entries
Почему первый список методов использует динамическую диспетчеризацию вместо статической диспетчеризации? Если бы использовалась статическая рассылка, будет ли их использование ограничено?
1 ответ
Статическая диспетчеризация использует мономорфизацию, которая приводит к созданию отдельной копии кода для каждого конкретного типа.
Если у вас есть функция, которая используется со многими конкретными типами, вы можете понести большие штрафы во время компиляции, чтобы создать и оптимизировать все эти версии. Это произойдет, даже если мономорфизация не увеличивает производительность в этих случаях.
Вместо этого вы можете использовать объект признака, который создает единственную реализацию кода (для &Trait
).
Эти методы были добавлены как часть RFC 640, но обсуждение, кажется, не затрагивает этот аспект. Фактически они изначально были реализованы со статической диспетчеризацией. Только позже они были изменены, чтобы принять признак объекта:
Перестройте конструкторы отладки для минимизации кода
Переключение с общих границ на объекты-черты и использование внутренних методов без вложенных элементов должно сократить размер отладок, так как мы заботимся о скорости реализации отладки намного меньше, чем двоичное раздувание.