Es posible en línea de una expresión lambda?[duplicar]
Pregunta
Quiero poner en línea una expresión lambda, ya que es muy corto por razones de rendimiento.Es posible?
Solución
El inline
palabras clave realidad no causa funciones a estar en línea.Cualquier recientes compilador va a tomar mejores decisiones con respecto a las alineaciones de los que voy.
En el caso de un corto lambda, la función probablemente va a estar en línea.
Si estás tratando de usar la inline
palabra clave con una lambda, la respuesta es no, no puedes usar eso.
Otros consejos
El compilador en línea de que si se puede.Por ejemplo, en 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 a la asamblea de que la 2*x
y printf
las lambdas están completamente insertados.
# 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 posible que una expresión de lambda pueda ser innumada.Bajo el capó, una expresión de lambda no es diferente a cualquier otro objeto de función.
Si una expresión de lambda en particular está dependiendo del compilador y si decide que vale la pena enlinar.
Si tiene un Functor de estructura regular, el compilador casi seguramente enlineará.Si tiene un estilo Lambda de estilo C ++ 0x, el compilador casi seguramente enlineará.Si está usando un impulso :: Lambda, entonces podría hacerlo, dependiendo de cómo funciona la lambda debajo de las escenas.Versión corta: no puede garantizar que esté enlineado o no en línea, pero debe confiar en su compilador y, en caso de que sea fácil y simple para enline.
No he examinado la salida de un Lot de ellos por ningún medio, pero hasta ahora todos los que he analizado la salida de haber sido in -nelada.
C ++ 1x 'lambdas, debajo de la capucha, generará objetos de función normales.Aquellos pueden ser incluidos por el compilador.
¿Alguna medida que hiciste sugerir que el compilador no los invadió en un lugar donde esto conduce a una pérdida de rendimiento notable?