Чтобы встроить вызов функции, компилятор должен знать 1. какая функция вызывается и 2. точный код этой функции.Вся цель функций virtual
состоит в том, чтобы отложить выбор функции, вызываемой во время выполнения, чтобы компиляторы могли получать вышеуказанные фрагменты информации только с помощью сложных методов оптимизации, которые требуют очень специфических обстоятельств 1 .
И шаблоны, и виртуальные функции (т.е. полиморф) являются инструментами для кодирования абстракции.Код, который использует CoefficientSpectrum
, на самом деле не заботится о деталях реализации спектра, а только о том, что вы можете, например, преобразовать его в RGB и из него - поэтому он использует абстракцию (чтобы избежать повторения кода для каждого вида спектра),Как объясняется в приведенном вами комментарии, использование полиморфизма для абстракции здесь будет означать, что компилятору сложно оптимизировать код, поскольку он принципиально откладывает выбор реализации до времени выполнения (что иногда полезно, но не является строго необходимым здесь).Требуя сделать выбор реализации во время компиляции, компилятор может легко оптимизировать (т. Е. Встроить) код.
1 Например, некоторые компиляторы могутоптимизируйте абстракцию std::function
, которая обычно использует полиморфизм для стирания типа.Конечно, это может работать только при наличии всей необходимой информации.