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