Ich bin auf eine gestoßen, #define
in der sie verwenden __builtin_expect
.
Die Dokumentation sagt:
Eingebaute Funktion:
long __builtin_expect (long exp, long c)
Sie können verwenden
__builtin_expect
, um dem Compiler Informationen zur Verzweigungsvorhersage bereitzustellen. Im Allgemeinen sollten Sie es vorziehen, hierfür das tatsächliche Profil-Feedback zu verwenden (-fprofile-arcs
), da Programmierer bekanntermaßen schlecht in der Vorhersage der tatsächlichen Leistung ihrer Programme sind. Es gibt jedoch Anwendungen, in denen diese Daten schwer zu erfassen sind.Der Rückgabewert ist der Wert von
exp
, der ein integraler Ausdruck sein sollte. Die Semantik des eingebauten ist, dass es erwartet wird, dassexp == c
. Beispielsweise:if (__builtin_expect (x, 0)) foo ();
würde anzeigen, dass wir nicht erwarten, anzurufen
foo
, da wir erwartenx
, Null zu sein.
Warum also nicht direkt verwenden:
if (x)
foo ();
anstelle der komplizierten Syntax mit __builtin_expect
?
if ( x == 0) {} else foo();
... oder einfach, if ( x != 0 ) foo();
was dem Code aus der GCC-Dokumentation entspricht.