В чем преимущества использования шаблона & lt; int size & gt; чем динамически выделять?

Я читаю pbrt, и он определил тип:

template <int nSpectrumSamples>
class CoefficientSpectrum;
class RGBSpectrum : public CoefficientSpectrum<3> {
using CoefficientSpectrum<3>::c;
typedef RGBSpectrum Spectrum;
// typedef SampledSpectrum Spectrum;

И автор сказал:

«Мы не написали систему так, чтобы выбор используемой реализации Spectrum мог быть решен во время выполнения; чтобы переключиться на другое представление, вся система должна быть перекомпилирована. Одним из преимуществ этой конструкции является то, что многие из различных Spectrum методы могут быть реализованы в виде коротких функций, которые могут быть встроены компилятором, а не оставлены в качестве автономных функций, которые должны вызываться посредством относительно медленного механизма вызова виртуальных методов. Встраивание часто используемых коротких функций, подобных этим, может дать существенное улучшение в исполнении. «

1.Почему шаблон может встроить функцию, а обычный способ не может?

2. Почему обычный способ должен использовать виртуальный метод?

Ссылка на весь заголовочный файл:
https://github.com/mmp/pbrt-v3/blob/master/src/core/spectrum.h

5

Решение

Чтобы встроить вызов функции, компилятор должен знать 1. какая функция вызывается и 2. точный код этой функции. Вся цель virtual Функция заключается в том, чтобы отложить выбор того, какая функция вызывается во время выполнения, поэтому компиляторы могут получать вышеуказанные фрагменты информации только с помощью сложных методов оптимизации, которые требуют очень специфических обстоятельств.1.

Как шаблоны, так и виртуальные функции (то есть polymorphy) являются инструментами для кодирования абстракции. Код, который использует CoefficientSpectrum на самом деле не заботятся о деталях реализации спектра, только то, что вы можете, например, преобразовать его в RGB и обратно — поэтому он использует абстракцию (чтобы не повторять код для каждого вида спектра). Как поясняется в приведенном вами комментарии, использование полиморфизма для абстракции здесь будет означать, что компилятору будет сложно оптимизировать код, поскольку он принципиально откладывает выбор реализации до времени выполнения (что иногда полезно, но не является строго необходимым здесь). Требуя сделать выбор реализации во время компиляции, компилятор может легко оптимизировать (т.е. встроить) код.

1Например, некоторые компиляторы могут оптимизировать std::function абстракция, которая обычно использует полиморф для стирания типа. Конечно, это может работать только при наличии всей необходимой информации.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]