Ist es möglich, einen Lambda-Ausdruck zu inline?[doppelt]
Frage
Ich möchte einen Lambda-Ausdruck einbinden, da er aus Leistungsgründen sehr kurz ist.Ist es möglich?
Lösung
Der inline
das Schlüsselwort bewirkt nicht, dass Funktionen inline sind.Jeder neuere Compiler wird bessere Entscheidungen in Bezug auf Inlining treffen als Sie.
Im Falle eines kurzen Lambda wird die Funktion wahrscheinlich inline sein.
Wenn Sie versuchen, das zu verwenden inline
schlüsselwort mit einem Lambda, die Antwort ist nein, das können Sie nicht verwenden.
Andere Tipps
Der Compiler wird es einbinden, wenn es kann.Zum Beispiel 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;
}
generiert die Assembly, die der 2*x
und printf
lambdas sind komplett gefüttert.
# 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
Es ist möglich, dass ein Lambda-Expression inteilig ist.Unter der Haube ist ein Lambda-Ausdruck nicht anders als jedes andere Funktionsobjekt.
Ob ein bestimmter Lambda-Expression in Linien ist, hängt vollständig von dem Compiler ab und egal ob es sich entscheidet, dass es sich lohnt, eintrifft.
Wenn Sie einen regulären Strukturfunctor haben, wird der Compiler es fast sicherlich inline.Wenn Sie einen C ++ 0x-Stil-Lambda haben, wird der Compiler es fast sicherlich inline.Wenn Sie einen Boost verwenden :: Lambda, dann könnte es tun, je nachdem, wie das Lambda unter den Szenen arbeitet.Kurzfassung: Sie können nicht garantieren, dass es nicht garantiert, dass es den Eintrag oder Nichteinbau nicht garantiert, aber Sie sollten Ihrem Compiler vertrauen und im Zweifelsfall es einfach und einfach zu inline machen.
Ich habe den Ausgang nicht von einem lot von allen Mitteln angesehen, aber bisher habe ich alle von ihnen angesehen, von der sich die Ausgabe von integriert worden war.
c ++ 1x 'lambdas wird unter der Haube normale Funktionsobjekte generieren.Diese können vom Compiler übernommen werden.
Haben Sie Messungen, die Sie vorgenommen haben, den Compiler nicht an einem Ort in Verbindung gebracht, an dem dies zu einem bemerkenswerten Leistungsverlust führt?