Como as macros prováveis / improváveis no kernel do Linux funcionam e qual é o benefício delas?
Eu estive procurando por algumas partes do kernel Linux e encontrei chamadas assim:
if (unlikely(fd < 0))
{
/* Do something */
}
ou
if (likely(!err))
{
/* Do something */
}
Eu encontrei a definição deles:
#define likely(x) __builtin_expect((x),1)
#define unlikely(x) __builtin_expect((x),0)
Eu sei que eles são para otimização, mas como eles funcionam? E quanto a diminuição de desempenho / tamanho pode ser esperada de usá-los? E vale a pena o incômodo (e provavelmente a perda da portabilidade) pelo menos no código do gargalo (no espaço do usuário, é claro).