Можно ли встраивать лямбда-выражение?

Я хочу встроить выражение лямбда, так как оно очень короткое по причине производительности. Возможно ли это?

Ответ 1

Ключевое слово inline фактически не заставляет функции быть встроенными. Любой недавний компилятор собирается принимать более эффективные решения в отношении вложения, чем вы.

В случае короткой лямбда функция, вероятно, будет встроена.

Если вы пытаетесь использовать ключевое слово inline с лямбдой, ответ будет отрицательным, вы не сможете его использовать.

Ответ 2

Компилятор сделает это, если сможет. Например, в 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;
}

создает сборку, в которой lambdas 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

Ответ 3

Возможно, что лямбда-выражение может быть встроено. Под капотом выражение лямбда не отличается от любого другого функционального объекта.

Независимо от того, является ли конкретное lambda-выражение встроенным, полностью зависит от компилятора и определяет ли он его значение.

Ответ 4

Если у вас есть регулярный функтор структуры, компилятор почти наверняка включит его. Если у вас есть лямбда в стиле С++ 0x, компилятор почти наверняка включит его. Если вы используете boost:: lambda, то это может сделать, в зависимости от того, как лямбда работает под сценами. Короткая версия: вы не можете гарантировать ее встраивание или не встраивание, но вы должны доверять своему компилятору и, если сомневаетесь, упростить и упростить встроенный интерфейс.

Ответ 5

Я не смотрел вывод из многих из них каким-либо образом, но до сих пор все из них, на которые я смотрел вывод, были встроены.

Ответ 6

С++ 1x 'lambdas будет, под капотом, генерировать нормальные объекты функции. Они могут быть встроены в компилятор.

Были ли какие-либо сделанные вами измерения предполагали, что компилятор не встроил их в место, где это приводит к заметной потере производительности?