Два варианта функции с простым оператором if посередине - PullRequest
0 голосов
/ 04 марта 2019

Этот вопрос является своего рода дизайнерским.В основном я часто получаю десять, чтобы получить функцию, которая выполняет высокие вычисления, но где-то посередине она имеет оператор if, который сильно влияет на производительность всей программы.

Рассмотрим этот пример:

void f(bool visualization)
{
    while(...)
    {
        // Many lines of computation
        if (visualization) 
        {
            // do the visualization of the algorithm
        }
        // More lines of computation
    }    
}

Проблема в этом примере заключается в том, что если для bool visualization задано значение false, то, я думаю, программа будет проверять, верно ли это на каждой итерации цикла.

Единственное решение - просто создать две отдельные функции с визуализацией и без нее:

void f()
{
    while(...)
    {
        // Many lines of computation
        // More lines of computation
    }    
}

void f_with_visualization()
{
    while(...)
    {
        // Many lines of computation
        // do the visualization of the algorithm
        // More lines of computation
    }    
}

Так что теперь у меня нет if проверок.Но это создает другую проблему: беспорядок в моем коде, и это нарушение DRY.

Мой вопрос здесь: есть ли способ сделать это лучше, не копируя код?Или, может быть, оптимизатор компилятора C ++ проверит, какую версию функции я хочу выполнить (с bool = true или bool = false), а затем создаст фиктивные функции без этой if проверки сам (как те, что я создал сам)?

1 Ответ

0 голосов
/ 04 марта 2019

Вы можете создать шаблон функции для параметра bool и использовать if constexpr.Как это:

template<bool visualization>
void f_impl()
{
    while(...)
    {
        // Many lines of computation
        if constexpr (visualization) 
        {
            // do the visualization of the algorithm
        }
        // More lines of computation
    }    
}

void f(bool visualization)
{
    if (visualization)
        f_impl<true>();
    else
        f_impl<false>();
}
...