문제

성능 이유가 매우 짧기 때문에 람다 표현을 인라인하고 싶습니다. 가능합니까?

도움이 되었습니까?

해결책

inline 키워드는 실제로 함수가 인라인 될 수 없습니다.최근의 컴파일러는 귀하보다 인라인과 관련하여 더 나은 결정을 내릴 것입니다.

짧은 람다의 경우, 기능은 아마도 인라인 될 것입니다.

람다가있는 inline 키워드를 사용하려고하면 대답은 아니요, 그렇게 사용할 수 없습니다.

다른 팁

컴파일러는 수 있습니다.예를 들어, 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;
}
.

2*xprintf 람다를 완전히 인라인 한 조립품을 생성합니다.

# 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
.

람다 표현이 인라인 될 수 있습니다.후드 아래에서 람다 표현식은 다른 함수 객체와 다르지 않습니다.

특정 람다 발현이 인라인이 표시되는지 여부는 완전히 컴파일러에 의존하고 그것이 인라인 가치가 있는지 결정하는지 여부는

일반 struct functor가있는 경우 컴파일러는 거의 확실하게 인라인 할 것입니다.C ++ 0x Style Lambda가있는 경우 컴파일러는 거의 확실히 인라인합니다.부스트 :: 람다를 사용하는 경우 람다가 장면 밑에 어떻게 작동하는지에 따라 할 수 있습니다.짧은 버전 : 당신은 그것이 인라인 또는 비 인출을 보장 할 수 없지만 컴파일러를 신뢰해야하며 의심의 여지가있는 경우 쉽고 간단하게 인라인으로 만들어야합니다.

나는 어떤 수단에 의해 lot 에서 출력을 보지 못했지만, 지금까지는 출력이 인라인 된 결과를 보았습니다.

C ++ 1x '람다 가드 아래에서 정상적인 기능 객체를 생성합니다.컴파일러가 인라인 할 수 있습니다.

컴파일러가 주목할만한 성능 손실로 이어지는 곳에서 컴파일러가 인라인하지 않았 으면 모든 측정을 했습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top