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).

questionAnswers(10)

yourAnswerToTheQuestion