Руководство пользователя GCC показывает только примеры, где __builtin_expect() помещается вокруг всего условия оператора if.
Я также заметил, что GCC не жалуется, если я его использую, например, с тернарным оператором или любым произвольным интегральным выражением, даже если оно не используется в контексте ветвления.
Итак, интересно, каковы основные ограничения его использования на самом деле.
Сохраняет ли это эффект при использовании в тройной операции, например:
int foo(int i)
{
return __builtin_expect(i == 7, 1) ? 100 : 200;
}
А как насчет этого случая:
int foo(int i)
{
return __builtin_expect(i, 7) == 7 ? 100 : 200;
}
И этот:
int foo(int i)
{
int j = __builtin_expect(i, 7);
return j == 7 ? 100 : 200;
}