Domanda

Voglio inlineare un'espressione di lambda poiché è molto breve per la ragione performance. È possibile?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top