Die Wahl zwischen Lambda und Funktorklasse ist ein Kompromiss.
Der Gewinn von Lambda ist größtenteils syntaktisch, indem die Menge an Boilerplate minimiert wird und konzeptionell relevanter Code innerhalb der Funktion, die ihn verwenden wird (sofort oder später), inline geschrieben werden kann.
In Bezug auf die Leistung ist dies nicht schlechter als eine Funktorklasse , die eine C ++ - Struktur oder -Klasse ist, die eine einzelne "Methode" enthält. Tatsächlich behandeln Compiler Lambda nicht anders als eine vom Compiler generierte Funktorklasse hinter den Kulissen.
// 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);
In Ihrem Codebeispiel unterscheidet es sich in Bezug auf die Leistung nicht von einem Funktionsaufruf, da diese Funktionsklasse zufällig keinen Status hat (weil sie eine leere Erfassungsklausel enthält) und daher keine Zuordnung, keinen Konstruktor oder Zerstörung erfordert.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Das Debuggen von nicht-trivialem C ++ - Code mit einem Disassembler war schon immer eine schwierige Aufgabe. Dies gilt mit oder ohne Lambda. Dies wird durch die ausgeklügelte Codeoptimierung durch den C ++ - Compiler verursacht, die zu einer Neuordnung, Verschachtelung und Beseitigung von totem Code führte.
Der Name-Mangling-Aspekt ist etwas unangenehm und die Debugger-Unterstützung für Lambda steckt noch in den Kinderschuhen . Es kann nur gehofft werden, dass sich die Debugger-Unterstützung mit der Zeit verbessern wird.
Derzeit ist die beste Methode zum Debuggen von Lambda-Code die Verwendung eines Debuggers, der das Festlegen von Haltepunkten auf Quellcodeebene unterstützt, dh durch Angabe des Namens der Quelldatei und der Zeilennummer.