Лямбда обычно дешевая.
SomeType var;
auto lambda = [var](){ /* ... */ }
здесь, lambda
- это просто экземпляр анонимного типа. Сам тип обрабатывается во время компиляции, поэтому не стоит беспокоиться. Однако во время выполнения происходит захват переменных (здесь var
). Когда захват выполняется по значению, само значение копируется в лямбда-экземпляр. Это то, что стоит. Когда захват выполняется по ссылке, ссылка копируется в лямбду, что дешево.
Для вашей информации, отображаемый код эквивалентен:
SomeType var;
struct anonymous {
anonymous(SomeType st) : st(st) {}
void operator()() { /* .... */ }
private:
SomeType st;
} lambda(var);