Kann wahrscheinlich / unwahrscheinlich Makros in User-Space-Code verwendet werden?
-
13-09-2019 - |
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.
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