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?
Antwort
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.
Im #else Teil sollten sie nicht zu (x) auswerten und nicht leer? –
oops, ja natürlich. Bearbeitet – Tomas
welche Header-Datei enthält diese Definition in Benutzer Include-Verzeichnisse? –
Die wahrscheinliche() und unwahrscheinlich() Makros sind ziemlich in die Kernel-Header definiert Namen für etwas, das eine echte gcc feature
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.
@Nikolai Vielen Dank für den Link. –
Kein Problem. Dies ist ein sehr aufschlussreiches Papier, sogar auf eine dritte Lesung :) –
- 1. Scala-Makros, wo werden sie verwendet?
- 2. Verwendet MS Excel Makros intern?
- 3. Sitzungsvariablen können nicht im Integrationstest in Schienen verwendet werden
- 4. Wie können Lenker im Ghost Post Editor verwendet werden?
- 5. Wie können Teiltöne im Express.js-Layout verwendet werden?
- 6. Wie können CSS3-Animationen im IE 8/9 verwendet werden?
- 7. Können Racket-Makros Schlüsselwortargumente übernehmen?
- 8. Können Makros zu einer Kombination von Mustern erweitert werden?
- 9. Umbraco Makros im Menü
- 10. Wie können Kommentare in Lenkervorlagen verwendet werden?
- 11. Wo werden Makros gespeichert?
- 12. Können Variablen in ElasticSearch-Indexvorlagen verwendet werden?
- 13. Können canDropLabels in DateTimeAxis verwendet werden?
- 14. Können C/C++ - Präprozessor-Makros Standardparameterwerte haben?
- 15. Können virtuelle Funktionen in Rückgabewerten verwendet werden?
- 16. ActiveAdmin-Helfer können nicht verwendet werden
- 17. Welche Datenbanken können mit Java verwendet werden?
- 18. Wofür können JSON-Zeichenfolgen verwendet werden?
- 19. Wie können Ereignisse wie CancelEventArgs verwendet werden?
- 20. Tabellenviewer und Editor können nicht verwendet werden
- 21. Wie können% -Zeichen in Bezeichnern verwendet werden
- 22. Können UILongPressGestureRecognizer und UISwipeGestureRecognizer zusammen verwendet werden?
- 23. Wie können Bootstrap-Optionsfelder verwendet werden?
- 24. Können Operatoren als Funktionen verwendet werden? (C++)
- 25. Wie können Knotenumgebungsvariablen in Gulp verwendet werden?
- 26. Entwurfsmuster, die im .NET-Framework verwendet werden?
- 27. Wie können Pakete eingeblendet werden, wenn nur Stapel verwendet werden?
- 28. Wie können zirkuläre Abhängigkeiten vermieden werden, wenn Callbacks verwendet werden?
- 29. Wie können Ressourcen geschützt werden, die in einer Multithread- oder asynchronen Umgebung verwendet werden können?
- 30. Wie können Produktionsdaten im Freien wiederhergestellt werden?
http://kerneltrap.org/node/4705 – pmg
duplizieren? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –
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. –