Frage

Ich kam in diesen zwei Makros in Linux-Kernel-Code. Ich weiß, sie sind Anweisungen zu Compiler (gcc) für Optimierungen bei der Verzweigung. Meine Frage ist, können wir diese Makros im User-Space-Code verwenden? Wird es jede Optimierung geben? Jedes Beispiel wird sehr hilfreich sein.

War es hilfreich?

Lösung

Ja, sie können. Im Linux-Kernel , werden sie definiert als

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

Die __builtin_expect Makros sind GCC spezifische Makros, die die Verzweigungsvorhersage verwendet werden; sie sagen, dem Prozessor, ob eine Bedingung als wahr wahrscheinlich ist, so dass der Prozessor Anweisungen auf der richtigen „Seite“ Prefetch kann der Branche.

Sie sollten die definiert in einer ifdef wickeln Kompilierung auf anderen Compilern zu gewährleisten:

#ifdef __GNUC__
#define likely(x)       __builtin_expect(!!(x), 1)
#define unlikely(x)     __builtin_expect(!!(x), 0)
#else
#define likely(x)       (x)
#define unlikely(x)     (x)
#endif

Es wird auf jeden Fall Optimierungen geben, wenn Sie es für eine korrekte Verzweigungsvorhersagen verwendet werden.

Andere Tipps

Werfen Sie einen Blick in Was jeder Programmierer über Speicher unter „6.2.2 wissen sollten Optimierung der Stufe 1 Instruction Cache Access.“- gibt es einen Abschnitt über genau diese

Die wahrscheinliche () und unwahrscheinlich () Makros sind ziemlich Namen definiert in den Kernel-Header für etwas, das ist ein echtes gcc Funktion

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top