是否可以内联lambda表达式?

时间:2010-07-22 13:50:15

标签: stl c++11

我想内联一个lambda表达式,因为它因性能原因而非常短。有可能吗?

6 个答案:

答案 0 :(得分:16)

inline关键字实际上并不会导致函数内联。任何最近的编译器都会做出更好的内联决策。

在短lambda的情况下,函数可能会内联。

如果您尝试将inline关键字与lambda一起使用,答案是否定的,您不能使用它。

答案 1 :(得分:13)

如果可以,编译器将内联它。例如,在带有-O2的g ++ 4.5中,

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

答案 2 :(得分:9)

lambda表达式可能是内联的。在引擎盖下,lambda表达式与任何其他函数对象没有区别。

特定lambda表达式是否内联完全取决于编译器以及它是否决定值得内联。

答案 3 :(得分:3)

如果你有一个常规的struct functor,编译器几乎肯定会内联它。如果你有一个C ++ 0x样式的lambda,编译器几乎肯定会内联它。如果您正在使用boost :: lambda,那么它可能会这样做,具体取决于lambda在幕后的工作方式。简短版本:您不能保证它是内联或非内联,但您应该信任您的编译器,如果有疑问,请简单内联。

答案 4 :(得分:1)

我没有以任何方式查看过它们的 lot 的输出,但到目前为止,我看过所有这些输出都是内联的。

答案 5 :(得分:0)

C ++ 1x'lambdas将在引擎盖下生成普通的函数对象。这些可以由编译器内联。

您所做的任何测量都表明编译器没有将它们内联到导致显着性能损失的地方吗?