Как избежать разветвления с помощью массивов - PullRequest
0 голосов
/ 29 апреля 2020

допустим, у меня есть очень простая функция с именем foo. Foo может вернуть два значения, я буду использовать x и y в качестве произвольных переменных-заполнителей.

Я определяю это так:

int foo(bool expression)
{
    static const int x = ..., y = ...;

    if(expression)
        return x;
    else
        return y;
}

Это очевидно оператор ветвления

Я думал, что выполнение чего-то подобного следующему может удалить любое ветвление:

int foo(bool expression)
{
    static const int array[] = {x, y};

    return array[expression];
}

Тем не менее, я не уверен, что при использовании C массивов это по-прежнему вызывает ветвление, не так ли? Являются ли массивы или векторы C ++ std:: причиной ветвления?

Стоит ли пытаться читать из массива или это пустая трата памяти и скорость выполнения?

И, наконец, если expression содержит логическое выражение, такое как &&, означает ли это, что оно все еще будет ветвиться?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Вопрос осложняется тем, что в одном случае вы показываете bool expression, в другом случае вы показываете int condition.

Если ваше выражение естественно оценивается как int, тогда использование этого int для выбора элемента из массива не будет включать никакого ветвления. Если наиболее естественный тип, по которому ваше выражение оценивает, - bool, то вам нужно будет преобразовать его в int, и это преобразование, скорее всего, будет включать внутреннее ветвление, поэтому вы, вероятно, ничего не получите. Я говорю «вероятно», потому что многое зависит от компилятора и базового набора команд ЦП, поэтому вы не узнаете, если ваш компилятор не произведет разборку и не изучит разборку.

Сказанное выше, я добавлю, что ваше стремление устранить ветку - скорее бесполезное упражнение Нет ничего плохого в ветвлении, и оно не работает плохо. Правда, лучше всего удалять ветки, но только если это тривиально. Если для устранения ветвления вы вводите массив, которого у вас не было бы иначе, то вы, вероятно, добавляете на порядок больше накладных расходов, чем экономите. Если вы вводите вектор вместо массива, вы можете вводить в два раза больше ресурсов массива. Итак, моя рекомендация по этому поводу: не беспокойтесь о ветвлении.

1 голос
/ 29 апреля 2020

Поскольку condition полагается на логическое значение, чтобы знать, что делать дальше, то оно определенно ветвится. Разумно сказать, что сам код должен ждать и переходить, чтобы решить, к какому элементу из массива обращаться и возвращать.

По той же концепции && или любой другой логический оператор подразумевает ветвление.

...