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