Pergunta

Eu quero inline uma expressão lambda, pois é muito curto para o desempenho razão.É possível?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top