Ho trovato queste 2 macro nel codice del kernel di Linux. So che sono istruzioni per il compilatore (gcc) per le ottimizzazioni in caso di ramificazione. La mia domanda è, possiamo usare queste macro nel codice dello spazio utente? Darà qualche ottimizzazione? Ogni esempio sarà molto utile.È possibile utilizzare macro probabili/improbabili nel codice dello spazio utente?
risposta
Si possono. In the Linux kernel, essi sono definiti come
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
Le macro __builtin_expect sono macro specifiche GCC che utilizzano la previsione ramo; dicono al processore se è probabile che una condizione sia vera, in modo che il processore possa precaricare le istruzioni sul "lato" corretto del ramo.
Si dovrebbe avvolgere le definisce in un ifdef per garantire la compilazione su altri compilatori:
#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
Sarà sicuramente vi darà ottimizzazioni se lo si utilizza per correggere le previsioni di filiale.
Nella parte #else, non dovrebbero valutare (x) e non vuoti? –
oops, sì, certo. Modificato – Tomas
quale file di intestazione contiene questa definizione nelle directory utente include? –
La probabile() e improbabili() macro sono piuttosto nomi definiti negli header del kernel per qualcosa che è un vero e proprio gcc feature
Dai uno sguardo a What Every Programmer Should Know About Memory in "6.2.2 Ottimizzazione dell'accesso alla cache delle istruzioni di livello 1" - c'è una sezione su esattamente questo.
@Nikolai Grazie per il collegamento. –
Nessun problema. Questo è un documento molto illuminante, anche su una terza lettura :) –
- 1. È possibile utilizzare pipe nel codice in Angular 2?
- 2. È possibile utilizzare il cronometro nel codice di produzione?
- 3. come trovare l'utilizzo dello spazio su disco per utente?
- 4. È possibile ottenere commenti con macro?
- 5. Come utilizzare il kernel libcrc32c (o le stesse funzioni) nei programmi dello spazio utente?
- 6. Come accedere alla memoria dello spazio utente dal kernel Linux?
- 7. nel kernel e nello spazio utente
- 8. È possibile utilizzare ng-if per le dimensioni dello schermo
- 9. HtmlDecode dello spazio codificato in html non è lo spazio
- 10. Spazio utente vs driver di spazio kernel
- 11. utente valore versionName di AndroidManifest.xml nel codice
- 12. È possibile integrare Cake-Pattern e Macro?
- 13. È possibile annullare il metodo asincrono nel controllo utente ASP.NET?
- 14. - Modifica dello spazio dei nomi
- 15. È sicuro utilizzare le macro in R?
- 16. Valore dello spazio standard NSAutoLayout
- 17. È possibile utilizzare annotazioni per l'iniezione di codice?
- 18. È possibile includere/importare codice nel manifesto Android?
- 19. REBOL 3 - Dove è possibile accedere alle parole dello spazio dei nomi definite dall'utente?
- 20. Microsoft.Practices.EnterpriseLibrary.Data.DLL ma non è stato gestito nel codice utente
- 21. È possibile riutilizzare i nomi delle variabili con l'uso dello spazio dei nomi?
- 22. È possibile eseguire macro interattive o registrazioni in vim?
- 23. È possibile utilizzare parametri facoltativi nel targeting per codice .NET 3.5?
- 24. È possibile utilizzare newline all'interno del blocco di codice roxygen2?
- 25. È possibile utilizzare jquery per aggiungere commenti dinamici al codice?
- 26. È possibile utilizzare il codice lua in Unity3D
- 27. Come verificare se un indirizzo è leggibile nell'app dello spazio utente linux
- 28. Perché questo codice non è spazio costante?
- 29. Come correggere/convertire il rientro dello spazio nel testo sublime?
- 30. Multibranding dello stesso codice sorgente senza utilizzare xcode
http://kerneltrap.org/node/4705 – pmg
duplicato? http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel –
Ho controllato questi post, ma entrambi parlano di roba relativa al kernel. Volevo sapere se lo stesso può essere utilizzato nel codice utente. –