Отвечая на другой вопрос, мне стало интересно. Я хорошо знаю, что
if( __builtin_expect( !!a, 0 ) ) {
// not likely
} else {
// quite likely
}
сделает "вполне вероятную" ветвь быстрее (в общем), делая что-то по линии намека на процессор/изменяя порядок кода сборки/какую-то магию. (если кто-то может прояснить эту магию, которая также будет большой).
Но работает ли это для a) inline ifs, b) переменные и c) значения, отличные от 0 и 1? т.е. будет
__builtin_expect( !!a, 0 ) ? /* unlikely */ : /* likely */;
или
int x = __builtin_expect( t / 10, 7 );
if( x == 7 ) {
// likely
} else {
// unlikely
}
или
if( __builtin_expect( a, 3 ) ) {
// likely
// uh-oh, what happens if a is 2?
} else {
// unlikely
}
имеют какой-либо эффект? И все это зависит от целевой архитектуры?