Вопрос

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

Это было полезно?

Решение

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

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

Если вы пытаетесь использовать ключевое слово 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 лямбды полностью встроены.

# 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

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

Будь ли определенная экспрессия лямбда, полностью зависит от компилятора и решает ли он, стоит встроить.

Если у вас есть обычный структурный функтор, компилятор почти наверняка встроен.Если у вас есть лямбда в стиле C ++ 0x, компилятор почти наверняка встроен.Если вы используете Boost :: лямбда, то это может сделать, в зависимости от того, как лямбда работает под сценами.КОРОТКАЯ ВЕРСИЯ: Вы не можете гарантировать, что это встраивание или не вкладывая, но вы должны доверять своему компилятору, а если под сомнением, сделайте его легко и просто в наличии.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top