Какие преимущества использования шаблоначем динамически выделять? - PullRequest
0 голосов
/ 28 ноября 2018

Я читаю 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

1 Ответ

0 голосов
/ 28 ноября 2018

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

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

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

...