Ich möchte einen Lambda-Ausdruck inline, da es aus Leistungsgründen sehr kurz ist. Ist es möglich?Kann ein Lambda-Ausdruck eingebunden werden?
Antwort
Das Schlüsselwort inline
bewirkt nicht, dass Funktionen tatsächlich inline sind. Jeder neuere Compiler wird in Bezug auf Inlining bessere Entscheidungen treffen als Sie.
Bei einem kurzen Lambda wird die Funktion wahrscheinlich inline sein.
Wenn Sie versuchen, das inline
Schlüsselwort mit einem Lambda zu verwenden, ist die Antwort nein, das können Sie nicht verwenden.
Es ist trivial einfach, Gegenbeispiele für die Behauptung zu finden, dass ein neuer Compiler bessere Entscheidungen über das In-Lining treffen wird als ein gegebener menschlicher Wille. Ich bin überhaupt kein C-Guru, aber wenn ich einen geschwindigkeitskritischen Code hatte, erzeugt das Markieren einer Methode mit einem Inline-Hinweis oft eine schnellere ausführbare Datei. Alles, was man tun muss, ist den Code zu messen. Ich würde jedem empfehlen, dem gesagt wurde, dass der Compiler besser in der Lage ist, ein Testbett einzurichten, wo er verschiedene Funktionen mit und ohne Inline-Tipps testen kann, wenn man den Compiler austricksen kann. – jackmott
@jack Natürlich. Dafür brauchst du Dinge wie __declspec (forceinline) oder __declspec (noinline). Wenn dies zu einer messbaren Verbesserung führt, 1. brauchst du mehr LTO/LTCG, 2. du brauchst mehr PGO oder 3. Compiler Bugs. Compiler tun nicht alles, was die Leute behaupten, sie tun es die ganze Zeit, aber Inlining ist einer der Bereiche, in denen sie im Allgemeinen wirklich sehr gut sind. –
Es ist möglich, dass ein Lambda-Ausdruck inline ist. Unter der Haube unterscheidet sich ein Lambda-Ausdruck nicht von anderen Funktionsobjekten.
Ob ein bestimmter Lambda-Ausdruck inline ist, hängt vollständig vom Compiler ab und ob er entscheidet, lohnt sich.
Wenn Sie einen regulären Struktur Funktor haben, wird der Compiler es fast sicher inline. Wenn Sie ein C++ 0x-Stil Lambda haben, wird der Compiler es fast sicher inline. Wenn Sie ein boost :: lambda verwenden, dann könnte es auch funktionieren, abhängig davon, wie das Lambda unter den Szenen funktioniert. Kurze Version: Sie können nicht garantieren, dass es inlining oder nicht inlining ist, aber Sie sollten Ihrem Compiler vertrauen und im Zweifelsfall einfach und einfach inline machen.
Ich habe nicht auf die Ausgabe von einem Los von ihnen mit irgendwelchen Mitteln, aber bis jetzt alle von ihnen Ich habe die Ausgabe von inline angesehen worden.
C++ 1x 'lambdas erzeugt unter der Haube normale Funktionsobjekte. Diese können vom Compiler eingezeichnet werden.
Haben die von Ihnen durchgeführten Messungen ergeben, dass der Compiler sie nicht an einer Stelle inline eingefügt hat, an der dies zu einem bemerkenswerten Leistungsverlust führt?
Nitpick: Keine Arbeit an C++ 1x hat noch begonnen, und es ist nichts weiter als eine begründete Vermutung, dass es sogar ein C++ 1x geben wird. Das Komitee arbeitet immer noch an C++ 0x, und es ist nicht wahrscheinlich, dass der Arbeitstitel geändert wird, nur weil er nicht mit dem endgültigen Kurztitel des Standards übereinstimmt. –
@Christopher: Ich stimme nicht zu. Es ist wahrscheinlich, dass der nächste C++ - Standard C++ 11 sein wird, es könnte C++ 12 werden, es ist unwahrscheinlich, dass es C++ 10 wird, und es ist unmöglich, C++ 09 zu werden. Da die letzte (und nur die letzte) Ziffer unsicher ist, wird sie üblicherweise durch ein "x" ersetzt. Ob es lambdas haben wird, ist sicherlich nicht garantiert (sieh dir nur die konzepte an), aber es ist sehr unwahrscheinlich, dass sich das Komitee mit weniger zufrieden geben würde. – sbi
Der Witz ist, dass die 0x Hex jetzt ist, da die meisten Leute weiterhin C++ 0x verwenden – ZachS
Der Compiler wird es inline, wenn es möglich ist. Zum Beispiel wird in g ++ 4.5 mit -O2,
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a(10);
for (int i = 0; i < 10; ++ i) a[i] = i;
asm ("Ltransform_begin: nop; nop; nop; nop; nop; nop; ");
std::transform(a.begin(), a.end(), a.begin(), [] (int x) { return 2*x; });
asm ("Lforeach_begin: nop; nop; nop; nop; nop; nop; ");
std::for_each(a.begin(), a.end(), [] (int x) { printf("%d\n", x); });
asm ("Lforeach_done: nop; nop; nop; nop; nop; nop; ");
return 0;
}
erzeugt die Montage, dass die und printf
Lambdas vollständig inlined sind.
# 9 "x.cpp" 1
Ltransform_begin: nop; nop; nop; nop; nop; nop;
# 0 "" 2
.align 4,0x90
L13:
sall (%rax)
addq $4, %rax
cmpq %rax, %r12
jne L13
# 13 "x.cpp" 1
Lforeach_begin: nop; nop; nop; nop; nop; nop;
# 0 "" 2
.align 4,0x90
L14:
movl (%rbx), %esi
leaq LC0(%rip), %rdi
xorl %eax, %eax
LEHB1:
call _printf
LEHE1:
addq $4, %rbx
cmpq %r12, %rbx
jne L14
# 17 "x.cpp" 1
Lforeach_done: nop; nop; nop; nop; nop; nop;
# 0 "" 2
- 1. Wie kann config.php effizient eingebunden werden?
- 2. Wie kann jQuery in das ASP.Net-Projekt eingebunden werden?
- 3. Wie kann das Bootstrap-Framework in Netbeans-Webanwendungsprojekt eingebunden werden?
- 4. Wie kann Javascript auf der Clientseite von node.js eingebunden werden?
- 5. Wie kann eine externe Javascript-Datei bedingt eingebunden werden?
- 6. Wie kann pthread.h für Visual Studio eingebunden und gefunden werden?
- 7. Wie kann der Befehl exit in bash_profile alias eingebunden werden?
- 8. Wie kann die Vorlage dynamisch in AngularJS eingebunden werden?
- 9. Wie kann/sollte Zend Framework 2 in ein Git-Versions-Projekt eingebunden werden?
- 10. Wie kann CSS für ein bestimmtes Element deaktiviert werden, während eine externe CSS-Datei eingebunden wird?
- 11. Wie kann ein benutzerdefiniertes Panel mit dem NetBeans GUI Builder eingebunden werden?
- 12. Wie kann ein Array mit der Strongloop Loopback REST API eingebunden und bestellt werden?
- 13. Wie kann JIRA REST Java Client in ein JIRA-Plugin eingebunden werden?
- 14. Wie verhindert man, dass URLs in TextView eingebunden werden?
- 15. Wie können Dateien außerhalb des Buildkontexts von Docker eingebunden werden?
- 16. Wie können Automator-Variablen in AppleScript eingebunden werden?
- 17. Wie können Variablen in lokalisierte Strings eingebunden werden?
- 18. Wie alle angestammten SetUp-Seiten in FitNesse subwikis eingebunden werden?
- 19. Wie werden Serveradresse und Port programmgesteuert in Java EE eingebunden?
- 20. Wie können Deklaratives mit CodeDomProvider in C# eingebunden werden?
- 21. Muss eine ConcurrentHashMap in einen synchronisierten Block eingebunden werden?
- 22. Wie können Links in HTML- oder Jquery-Warnmeldungen eingebunden werden?
- 23. Wie können mehrere divs in eine einzelne Direktive eingebunden werden?
- 24. Wie können Bibliotheken von Drittanbietern in CodeIgniter eingebunden werden?
- 25. Wie können Android-Bibliotheken und Klassen für Sonar eingebunden werden?
- 26. Wie kann die JS-Datei zur Laufzeit in alle JSP-Seiten eingebunden werden?
- 27. Wo kann eine Bestätigungsseite in den Django-Administrator eingebunden werden? (ähnlich Delete Bestätigung)
- 28. Wie kann in WPF von der DataTemplate einer enthaltenen ListBox in den Window DataContext eingebunden werden?
- 29. Wie kann CSS und jQuery in mein WordPress-Plugin eingebunden werden?
- 30. Wie kann eine dynamische Vorlage aus einer anderen App in Django eingebunden werden?
Da die Funktion in der Klassendefinition definiert ist, ist sie standardmäßig 'inline'. – GManNickG
dup: http://Stackoverflow.com/q/15930755/86967 – nobar