Frage

Ich möchte einen Lambda-Ausdruck einbinden, da er aus Leistungsgründen sehr kurz ist.Ist es möglich?

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top