Lambda ve functor sınıfı arasındaki seçim bir ödünleşmedir.
Lambda'dan elde edilen kazanç, kazan plakası miktarını en aza indirgeyerek ve kavramsal olarak ilgili kodun, onu kullanacak fonksiyonun içinde (hemen veya daha sonra) satır içinde yazılmasına izin vererek çoğunlukla sözdizimseldir.
Performans açısından, bu bir C ++ yapısı veya tek bir "yöntem" içeren sınıf olan bir functor sınıfından daha kötü değildir . Aslında, derleyiciler lambda'yı sahnenin arkasında derleyici tarafından üretilen bir functor sınıfından farklı şekilde ele almazlar.
// 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);
Kod örneğinizde, performans açısından bir işlev çağrısından farklı değildir, çünkü bu functor sınıfının hiçbir durumu yoktur (çünkü boş bir yakalama cümlesi vardır), bu nedenle tahsis, kurucu veya yıkım gerektirmez.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Önemsiz bir C ++ kodunu bir sökücü kullanarak hata ayıklamak her zaman zor bir iş olmuştur. Bu lambda kullanarak veya kullanmadan doğrudur. Bunun nedeni, C ++ derleyicisinin yeniden sıralama, serpiştirme ve ölü kod ortadan kaldırmasıyla sonuçlanan karmaşık kod optimizasyonudur.
İsim yönetme yönü biraz tatsızdır ve lambda için hata ayıklayıcı desteği hala başlangıç aşamasındadır . Yalnızca hata ayıklayıcı desteğinin zaman içinde iyileşeceği umulmaktadır.
Şu anda, lambda kodunda hata ayıklamanın en iyi yolu, kaynak kod düzeyinde kesme noktalarını ayarlamayı destekleyen bir hata ayıklayıcı kullanmaktır, yani kaynak dosya adını ve satır numarasını belirterek.