Wybór pomiędzy lambda a klasą funktorów jest kompromisem.
Zysk z lambda jest w większości składniowy, ponieważ minimalizuje liczbę podstawek i pozwala na wpisanie kodu związanego z koncepcją wewnątrz funkcji, która będzie go używać (natychmiast lub później).
Pod względem wydajności nie jest to gorsze niż klasa funktorów , która jest strukturą C ++ lub klasą zawierającą pojedynczą „metodę”. W rzeczywistości kompilatory traktują lambda nie inaczej niż generowana przez kompilator klasa funktorów za sceną.
// define the functor method somewhere
struct some_computer_generated_gibberish_0123456789
{
int operator() (int x) const
{
if (x == 2) return 5;
if (x == 3) return 6;
return 0;
}
};
// make a call
some_computer_generated_gibberish_0123456789 an_instance_of_0123456789;
int outputValue = an_instance_of_0123456789(inputValue);
W twoim kodzie pod względem wydajności nie różni się niczym od wywołania funkcji, ponieważ ta klasa funktorów nie ma żadnego stanu (ponieważ ma pustą klauzulę przechwytywania), a zatem nie wymaga alokacji, konstruktora ani zniszczenia.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Debugowanie dowolnego nietrywialnego kodu C ++ za pomocą deasemblera zawsze było trudnym zadaniem. Jest to prawdą z użyciem lambda lub bez. Jest to spowodowane zaawansowaną optymalizacją kodu przez kompilator C ++, która spowodowała zmianę kolejności, przeplatanie i eliminację martwego kodu.
Aspekt zmieniający nazwy jest nieco niesmaczny, a obsługa debuggera dla lambda jest wciąż w powijakach . Można mieć tylko nadzieję, że z czasem poprawi się obsługa debuggera.
Obecnie najlepszym sposobem debugowania kodu lambda jest użycie debugera, który obsługuje ustawianie punktów przerwania na poziomie kodu źródłowego, tj. Poprzez podanie nazwy pliku źródłowego i numeru linii.