람다와 functor 클래스 중에서 선택하는 것은 트레이드 오프입니다.
람다로부터 얻는 이득은 상용구의 양을 최소화하고 개념 관련 코드를 활용하는 함수 내에서 (즉시 또는 나중에) 개념적으로 작성된 코드를 인라인으로 작성할 수있게함으로써 대부분 문법적입니다.
성능 측면에서 이것은 단일 "메소드"를 포함하는 C ++ 구조체 또는 클래스 인 functor 클래스 보다 나쁘지 않습니다 . 실제로 컴파일러는 람다를 컴파일러가 생성 한 functor 클래스와 다르게 처리합니다.
// 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);
코드 예제에서 성능 측면에서는 함수 호출과 다르지 않습니다. functor 클래스에는 상태가 없기 때문에 (빈 캡처 절이 있으므로) 할당, 생성자 또는 소멸이 필요하지 않기 때문입니다.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
디스어셈블러를 사용하여 사소한 C ++ 코드를 디버깅하는 것은 항상 어려운 작업이었습니다. 이것은 람다를 사용하거나 사용하지 않고 적용됩니다. 이는 C ++ 컴파일러의 정교한 코드 최적화로 인해 재정렬, 인터리빙 및 데드 코드 제거가 발생했습니다.
이름 변환 측면은 다소 적합하지 않으며 람다에 대한 디버거 지원은 아직 초기 단계 입니다. 디버거 지원이 시간이 지남에 따라 향상되기를 바랍니다.
현재 람다 코드를 디버깅하는 가장 좋은 방법은 소스 코드 수준에서 중단 점 설정을 지원하는 디버거를 사용하는 것입니다 (예 : 소스 파일 이름 및 줄 번호 지정).