2009-11-03 7 views
22

Ich stieß auf diese 2 Makros im Linux-Kernel-Code. Ich weiß, dass sie Anweisungen zum Compiler (gcc) für Optimierungen im Falle einer Verzweigung sind. Meine Frage ist, können wir diese Makros im User Space Code verwenden? Wird es irgendeine Optimierung geben? Jedes Beispiel wird sehr hilfreich sein.Können wahrscheinliche/unwahrscheinliche Makros im User-Space-Code verwendet werden?

+0

http://kerneltrap.org/node/4705 – pmg

+0

duplizieren? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –

+0

Ich habe diese Beiträge überprüft, aber beide sprechen wieder über Kernel-bezogene Sachen. Ich wollte wissen, ob das gleiche im Benutzercode verwendet werden kann. –

Antwort

40

Ja, sie können ist. In the Linux kernel, werden sie als

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

__builtin_expect Die Makros sind GCC spezifische Makros definiert, die die Verzweigungs-Vorhersage verwenden; Sie teilen dem Prozessor mit, ob eine Bedingung wahrscheinlich wahr ist, so dass der Prozessor Anweisungen auf der richtigen "Seite" der Verzweigung abrufen kann.

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 definitiv Optimierungen geben, wenn Sie es für eine korrekte Verzweigungsvorhersagen verwenden.

+1

Im #else Teil sollten sie nicht zu (x) auswerten und nicht leer? –

+1

oops, ja natürlich. Bearbeitet – Tomas

+0

welche Header-Datei enthält diese Definition in Benutzer Include-Verzeichnisse? –

4

Die wahrscheinliche() und unwahrscheinlich() Makros sind ziemlich in die Kernel-Header definiert Namen für etwas, das eine echte gcc feature

9

Werfen Sie einen Blick in What Every Programmer Should Know About Memory unter "6.2.2 Optimierung Level 1 Befehl Cache Access" - es gibt einen Abschnitt über genau dies.

+0

@Nikolai Vielen Dank für den Link. –

+0

Kein Problem. Dies ist ein sehr aufschlussreiches Papier, sogar auf eine dritte Lesung :) –