Jak działają prawdopodobne / mało prawdopodobne makra w jądrze Linuksa i jakie są ich zalety?

Przeglądałem niektóre części jądra Linuksa i znalazłem takie połączenia:

if (unlikely(fd < 0))
{
    /* Do something */
}

lub

if (likely(!err))
{
    /* Do something */
}

Znalazłem ich definicję:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

Wiem, że służą optymalizacji, ale jak działają? A od czego można oczekiwać spadku wydajności / rozmiaru? I czy jest to warte kłopotów (i prawdopodobnie utraty przenośności) przynajmniej w kodzie wąskiego gardła (oczywiście w przestrzeni użytkownika).

questionAnswers(10)

yourAnswerToTheQuestion