Wie funktionieren die wahrscheinlichen / unwahrscheinlichen Makros im Linux-Kernel und was ist ihr Nutzen?

Ich habe einige Teile des Linux-Kernels durchgearbeitet und folgende Aufrufe gefunden:

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

oder

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

Ich habe die Definition von ihnen gefunden:

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

Ich weiß, dass sie für die Optimierung sind, aber wie funktionieren sie? Und wie viel Leistung / Größenreduzierung ist mit ihrer Verwendung zu erwarten? Und ist es den Aufwand wert (und die Portabilität wahrscheinlich zu verlieren), zumindest im Engpass-Code (natürlich im User-Bereich)?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage