В идеальном мире вы использовали бы шаблоны для статического полиморфизма, чтобы обеспечить максимальную производительность в случаях, когда тип не определяется пользовательским вводом.
Реальность такова, что шаблоны навязывают большую часть вашего кода.в заголовки, и это имеет последствия взрыва вашего времени компиляции.
Я выполнил несколько сложных обобщенных программ, используя статический полиморфизм для реализации универсальной библиотеки RPC (https://github.com/bytemaster/mace (ветвь rpc_static_poly)).В этом случае протокол (JSON-RPC, транспорт (TCP / UDP / Stream / и т. Д.) И типы) все известны во время компиляции, поэтому нет никаких причин делать vtable диспетчеризацию ... или есть?
Когда я запускаю код через препроцессор для single.cpp, получается 250 000 строк и более 30 секунд на компиляцию одного объектного файла.Я реализовал «одинаковую» функциональность в Java и C #, и она компилируется примерно за секунду.
Почти каждый заголовок stl или boost добавляет тысячи или десятки тысяч строк кода, которые должны обрабатываться для каждого объекта.файл, большая часть которого избыточна.
Имеет ли значение время компиляции?В большинстве случаев они оказывают более существенное влияние на конечный продукт, чем «максимально оптимизированное удаление vtable».Причина в том, что для каждой «ошибки» требуется цикл «попробовать исправить, скомпилировать, протестировать», и если каждый цикл занимает более 30 секунд, разработка замедляется до ползания (обратите внимание на мотивацию языка go Google).
Проведя несколько дней с Java и C #, я решил, что мне нужно «переосмыслить» свой подход к C ++.Нет причин, по которым программа на C ++ должна компилироваться намного медленнее, чем базовый C, который будет реализовывать ту же функцию.
Теперь я выбираю полиморфизм во время выполнения, если только профилирование не показывает, что узкое место находится в виртуальных отправлениях.Теперь я использую шаблоны, чтобы обеспечить полиморфизм «точно в срок» и типобезопасный интерфейс поверх базового объекта, который имеет дело с «void *» или абстрактным базовым классом.Таким образом, пользователям не нужно извлекать выгоду из моих «интерфейсов», и они по-прежнему ощущают «общее» программирование, но они получают преимущество быстрого времени компиляции.Если производительность становится проблемой, то общий код можно заменить статическим полиморфизмом.
Результаты впечатляющие, время компиляции сократилось с 30 с лишним секунд до примерно секунды.Исходный код постпроцессора теперь составляет пару тысяч строк вместо 250 000 строк.
С другой стороны дискуссии я разрабатывал библиотеку «драйверов» для набора похожих, но немного разных встроенных устройств.В этом случае во встроенном устройстве было мало места для «дополнительного кода» и не было необходимости для отправки «vtable».С C нашей единственной опцией были «отдельные объектные файлы» или «полиморфизм» времени выполнения через указатели функций.Используя общее программирование и статический полиморфизм, мы смогли создать поддерживаемое программное обеспечение, которое работало быстрее, чем все, что мы могли производить в C.