Является ли хорошей практикой всегда явно указывать такие сильно рекурсивные функции?
По-прежнему существует необходимость в шаблонировании таких функций с помощью MTP, поскольку у нас constexpr
уже много лет? И даже если constexpr
недостаточно, у нас будет consteval
в c ++ 20 (надеюсь).
Встраивание дает компилятору только возможность оптимизировать код, но это не гарантия. Сделайте его рекурсивной функцией шаблона, дающей компилятору возможность тратить вашу память с не встроенными рекурсивными экземплярами шаблона, что противоположно тому, чего вы хотите достичь! Если вы скомпилируете с -O0
, вы увидите много кода, сгенерированного из вашего примера.
Вы можете заставить компилятор генерировать результат во время компиляции, при условии, что вы можете использовать результирующее значение в качестве параметра шаблона, например.
Но как всегда в отношении оптимизации:
1) Постарайтесь получить лучший алгоритм
2) Попробуйте реализовать, чтобы сделать код поддерживаемым
3) Мера
4) Мера
5) Мера
И только если ваш код не соответствует вашим требованиям к скорости, начните оптимизацию вручную.
Фактически, ваш код может тратить много памяти, а также имеет возможность хорошо оптимизировать. Но вы должны перейти к constexpr
функциям вместо того, чтобы использовать более или менее нечитаемый код MTP. Таким образом, «встроенный» является лишь очень маленькой частью проблемы.
Ваш компилятор лучше, как вы считаете! Обычно! Если не веришь: измеряй! И только если вы видите реальную проблему: оптимизация ручной работы.
При использовании constexpr
, особенно с рекурсивными функциями, большинство компиляторов предоставляют флаги командной строки, чтобы дать уровень для более глубокой оценки времени компиляции, если вы НЕ заставляете компилятор получать результат во время компиляции с использованием результата в качестве параметра шаблона или любой другой «должен быть постоянной времени компиляции», такой как размер массива. Это зависит от используемого вами компилятора, поэтому, пожалуйста, прочитайте руководство!
Если вы используете std::cout
внутри рекурсии / цикла, вы никогда не увидите «оптимизацию с одним выходом». Но вообще: если у вас достаточно времени для использования std::cout
, вам не нужно думать о нескольких линиях сборки вокруг него. std::cout
обычно медленно связан с кодом, генерирующим данные, которые вообще должны быть записаны на консоль!
Не оптимизируйте неправильные вещи!
Добавить в:
Если вы действительно хотите сгенерировать строку времени компиляции из списка целых чисел, вы можете взять ее в качестве основы для своего примера: C ++ преобразовать целое число в строку во время компиляции