Est-il possible d'incorporer une expression lambda?[dupliquer]
Question
Je veux inline une expression lambda, car il est très court pour des raisons de performances.Est-il possible?
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?