Производительность SFINAE и если еще - PullRequest
0 голосов
/ 23 апреля 2019

Я знал, что if else может сгенерировать остановка конвейера (пузырь) , потому что предсказатель Ветвления не может продолжать правильно угадывать 100%. Одним словом, у многих if elif elif ... else плохая производительность.

В шаблоне C ++ у нас есть SFINAE . С SFINAE мы можем избежать кода if else. Например, чтобы проверить, является ли int нечетным или нет, мы можем кодировать как показано ниже:

template <int I> void div(char(*)[I % 2 == 0] = 0) {
    // this overload is selected when I is even
}
template <int I> void div(char(*)[I % 2 == 1] = 0) {
    // this overload is selected when I is odd
}

чтобы мы избегали

if (I % 2 == 0)
{
    // do things
}
else
{
    // do other things
}

Мой вопрос: у SFINAE лучшая производительность по сравнению с if else? СФИНАЕ может избежать пузыря трубопровода?

1 Ответ

5 голосов
/ 23 апреля 2019

С точки зрения производительности во время выполнения, буквально не имеет значения, какой вы делаете. Либо I можно узнать во время компиляции, и в этом случае любой полу-приличный компилятор выведет одинаковый постоянный регистр для обоих, или нет, и в этом случае способ SFINAE не будет компилироваться вообще.

...