Pregunta

Quiero poner en línea una expresión lambda, ya que es muy corto por razones de rendimiento.Es posible?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top