Действительно ли возможно встроить лямбда-выражение? [дубликат]

12
задан Deduplicator 26 August 2019 в 12:22
поделиться

6 ответов

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

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

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

16
ответ дан 2 December 2019 в 03:32
поделиться

Компилятор будет инлайнить его, если сможет. Например, в 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
13
ответ дан 2 December 2019 в 03:32
поделиться

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

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

9
ответ дан 2 December 2019 в 03:32
поделиться

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

3
ответ дан 2 December 2019 в 03:32
поделиться

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

1
ответ дан 2 December 2019 в 03:32
поделиться

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

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

0
ответ дан 2 December 2019 в 03:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: