해결책
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*x
및 printf
람다를 완전히 인라인 한 조립품을 생성합니다.
# 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 '람다 가드 아래에서 정상적인 기능 객체를 생성합니다.컴파일러가 인라인 할 수 있습니다.
컴파일러가 주목할만한 성능 손실로 이어지는 곳에서 컴파일러가 인라인하지 않았 으면 모든 측정을 했습니까?