Question

Je veux inline une expression lambda, car il est très court pour des raisons de performances.Est-il possible?

Était-ce utile?

La solution

L' inline mot clé n'a pas fait causer les fonctions inline.Toute récente compilateur va prendre de meilleures décisions en ce qui concerne l'in-lining que vous.

Dans le cas d'un court-lambda, la fonction sera probablement incorporé.

Si vous essayez d'utiliser la inline mot-clé avec un lambda, la réponse est non, vous ne pouvez pas l'utiliser.

Autres conseils

Le compilateur va l'aligner si possible.Par exemple, en G ++ 4.5 avec -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;
}

génère l'assemblage selon lequel les lambdas 2*x et printf sont complètement inlinés.

# 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

Il est possible qu'une expression de Lambda soit inlinée.Sous la hotte, une expression de Lambda n'est pas différente de tout autre objet de fonction.

Si une expression de Lambda particulière est inline dépend entièrement du compilateur et si elle décide que cela vaut la peine d'être inlinité.

Si vous avez un foncteur de structure régulier, le compilateur va presque certainement le signaler.Si vous avez un style C ++ 0x Lambda, le compilateur le fera presque certainement.Si vous utilisez un boost :: Lambda, alors cela pourrait faire, en fonction de la façon dont la Lambda fonctionne sous les scènes.Version courte: Vous ne pouvez pas vous garantir qu'il s'agit d'inliquer ou de non-inliquer, mais vous devez faire confiance à votre compilateur et en cas de doute, rendez-la simple et simple à en ligne.

Je n'ai pas regardé la sortie du lot d'entre eux, mais jusqu'à présent, tous j'ai regardé la production d'avoir été inline.

C ++ 1x 'Lambdas sera, sous la hotte, générer des objets de fonction normaux.Ceux-ci peuvent être inlinés par le compilateur.

Avez-vous fait des mesures que vous avez présentées que le compilateur ne les a pas signalés dans un endroit où cela conduit à une perte de performance notable?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top