是否有可能内联λ表达?[复制]
题
我想在线表达式表达式,因为它的性能原因非常短。是否有可能?
题
我想在线表达式表达式,因为它的性能原因非常短。是否有可能?
解决方案
inline
关键字实际上不会导致函数被联合。任何最近的编译器都会比你的内联更新决定。
在短LAMBDA的情况下,该功能可能会内衬。
如果您尝试使用lambda使用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
Lambdas完全环绕。
# 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
. 可能会内向的λ表达式。在引擎盖下,λ表达式与任何其他功能对象没有什么不同。
特定的lambda表达式是否完全取决于编译器,以及它是否决定它是值得的。
如果您有一个常规的结构算盘,编译器几乎肯定会在内联。如果您有一个C ++ 0x样式Lambda,则编译器几乎肯定会内联。如果您正在使用Boost :: lambda,那么它可能会这样做,具体取决于Lambda如何在幕后工作。简短版本:您无法保证它的内向或非内联,但您应该相信您的编译器,如果有疑问,请简单且简单地inline。
我没有通过任何方式从它们的 lot 的输出,但到目前为止,我都看过的所有输出已被联合。
c ++ 1x'lambdas将在引擎盖下,生成正常函数对象。这些可以由编译器引入。
您做出的任何测量表明编译器没有在这导致显着性能损失的地方蕴含它们?