La scelta tra lambda e la classe functor è un compromesso.
Il guadagno di lambda è principalmente sintattico, riducendo al minimo la quantità di boilerplate e consentendo la scrittura in linea del codice correlato concettualmente, all'interno della funzione che lo utilizzerà (immediatamente o successivamente).
Per quanto riguarda le prestazioni, questo non è peggio di una classe functor , che è una struttura o classe C ++ che contiene un singolo "metodo". In effetti, i compilatori trattano lambda non diversamente da una classe di funzioni generata dal compilatore dietro la scena.
// 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);
Nel tuo esempio di codice, dal punto di vista delle prestazioni non è diverso da una chiamata di funzione, perché quella classe di funzioni non ha uno stato (perché ha una clausola di acquisizione vuota), quindi non richiede allocazione, costruttore o distruzione.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Il debug di qualsiasi codice C ++ non banale utilizzando un disassemblatore è sempre stato un compito difficile. Questo è vero con o senza l'utilizzo di lambda. Ciò è causato dalla sofisticata ottimizzazione del codice da parte del compilatore C ++ che ha comportato il riordino, l'interleaving e l'eliminazione del codice morto.
L'aspetto del nome è alquanto sgradevole e il supporto del debugger per lambda è ancora agli inizi . Si può solo sperare che il supporto del debugger migliorerà nel tempo.
Attualmente, il modo migliore per eseguire il debug del codice lambda è utilizzare un debugger che supporti l'impostazione di punti di interruzione a livello di codice sorgente, ovvero specificando il nome del file di origine e il numero di riga.