Сколько стоит строительство лямбда-объекта? - PullRequest
0 голосов
/ 15 мая 2018

Для некоторых целей можно объявить функтор в часто вызываемой функции. Строительство функтора будет стоить много или просто сравнимо с определением простой структуры?

void f() {
    static int x = 0;
    auto a = [&](){ x += 1;};
    for (auto i = 0, i < 10; ++i) {
        a();
    }
}

// somewhere else call f thousands of times
f()

Редактировать Обновлен пример кода.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Лямбда обычно дешевая.

SomeType var;
auto lambda = [var](){ /* ... */ }

здесь, lambda - это просто экземпляр анонимного типа. Сам тип обрабатывается во время компиляции, поэтому не стоит беспокоиться. Однако во время выполнения происходит захват переменных (здесь var). Когда захват выполняется по значению, само значение копируется в лямбда-экземпляр. Это то, что стоит. Когда захват выполняется по ссылке, ссылка копируется в лямбду, что дешево.

Для вашей информации, отображаемый код эквивалентен:

SomeType var;
struct anonymous {
    anonymous(SomeType st) : st(st) {}
    void operator()() { /* .... */ }
private:
    SomeType st;
} lambda(var);
0 голосов
/ 15 мая 2018

Ответ как всегда: это зависит.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...