É possível inline uma expressão lambda?[duplicado]
Pergunta
Eu quero inline uma expressão lambda, pois é muito curto para o desempenho razão.É possível?
Solução
A palavra-chave inline
não faz com que as funções sejam inglesas.Qualquer compilador recente vai tomar melhores decisões em relação ao inlining do que você.
No caso de um lambda curto, a função provavelmente será inglesa.
Se você está tentando usar a palavra-chave inline
com um lambda, a resposta é não, você não pode usar isso.
Outras dicas
O compilador irá inline-lo se ele pode.Por exemplo, no g++ 4.5-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;
}
gera a montagem de 2*x
e printf
lambdas são completamente lineares.
# 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
É possível que uma expressão lambda possa ser inglesa.Sob o capô, uma expressão lambda não é diferente de qualquer outro objeto de função.
Se uma determinada expressão lambda é inglesa é inteiramente dependente do compilador e se ele decide que vale a pena inglesa.
Se você tiver um functor de estrutura regular, o compilador quase certamente o inline.Se você tiver um Lambda estilo C ++ 0x, o compilador quase certamente irá embalá-lo.Se você estiver usando um impulso :: lambda, então pode fazer, dependendo de como o lambda funciona embaixo das cenas.Versão curta: você não pode garantir que esteja ininsando ou não inglesa, mas você deve confiar em seu compilador e, em caso de dúvida, facilitar e simples inline.
Eu não olhei para a saída de um lote deles por qualquer meio, mas até agora todos eles já olhei para a saída de ter sido inglesa.
C ++ 1x 'lambdas vai, sob o capô, gerar objetos de função normais.Aqueles podem ser inglesa pelo compilador.
Alguma medida que você fez sugerir que o compilador não os inline em um lugar onde isso leva a uma perda notável de desempenho?