是否可以内联lambda表达式?

Tho*_*son 12 c++ lambda inline inlining c++11

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

Bil*_*eal 16

inline关键字实际上不会导致函数内联.任何最近的编译器都会在内联方面做出比你更好的决策.

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

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

  • 很容易想出一个例子,即最近的编译器会做出关于内嵌的更好的决定,而不是给定的人类意志.当我拥有速度关键代码时,我不是C大师,使用内联提示标记方法通常会产生更快的可执行文件.所有人要做的就是测量代码.我会告诉任何一个被告知编译器最好建立一个测试床的人,他们可以使用和不使用内联提示来计算各种功能,以便在你可以超越编译器时进行探索. (4认同)

ken*_*ytm 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;
}
Run Code Online (Sandbox Code Playgroud)

生成2*xprintflambda完全内联的程序集.

# 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
Run Code Online (Sandbox Code Playgroud)


Jam*_*lis 9

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

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