Soluzione
La parola chiave inline
non provoca effettivamente le funzioni da inchiesta.Qualsiasi recente compilatore prenderà decisioni migliori per quanto riguarda l'inquinamento rispetto a quello che vuoi.
Nel caso di una lambda corta, la funzione sarà probabilmente in linea.
Se stai cercando di utilizzare la parola chiave inline
con una Lambda, la risposta è no, non puoi usarlo.
Altri suggerimenti
Il compilatore inlinei se può.Ad esempio, in G ++ 4.5 con -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;
}
.
Genera il gruppo che gli Lambdas 2*x
e printf
sono completamente inseriti.
# 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
. È possibile che un'espressione di lambda possa essere innata.Sotto il cofano, un'espressione lambda non è diversa da qualsiasi altro oggetto funzione.
Se una particolare espressione lambda è interamente dipendente dal compilatore e se decide che vale la pena di inlineare.
Se hai un funtore di struttura regolare, il compilatore sarà quasi certamente in linea.Se hai uno stile C ++ 0x Lambda, il compilatore sarà quasi certamente in linea.Se stai usando un boost :: Lambda, allora potrebbe fare, a seconda di come funziona la Lambda sotto le scene.VERSIONE BREVE: Non è possibile garantire che sia in linea o non in linea, ma dovresti fidarti del tuo compilatore e in caso di dubbio, renderlo facile e semplice da inline.
Non ho esaminato l'output da lotto di loro con qualsiasi mezzo, ma finora tutti loro ho guardato l'output da è stato inlineto.
C ++ 1x 'Lambdas, sotto il cofano, generare oggetti di funzione normali.Quelli possono essere intestati dal compilatore.
Qualsiasi misurazione hai fatto suggerire che il compilatore non li ha in linea in un luogo in cui ciò porta a una perdita di prestazioni notevole?