Lambda 식은 오버로드된 함수 호출 연산자가 포함된 클래스를 만들고 변수를 멤버로 참조하여 구현됩니다. 이는 참조되는 변수의 수에 따라 람다 식의 크기가 달라진다는 것을 의미합니다. 그러나 std::function은 고정된 크기를 가져야 합니다. std::function의 구현을 이해하는 것이 중요합니다.
가변 크기 펑터에 대한 유형 삭제
std::function은 유형 삭제라는 기술을 사용하여 다음의 펑터를 처리합니다. 다양한 크기. int(double):
struct callable_base { virtual int operator()(double d) = 0; virtual ~callable_base() {} }; template <typename F> struct callable : callable_base { F functor; callable(F functor) : functor(functor) {} virtual int operator()(double d) { return functor(d); } }; class function_int_double { std::unique_ptr<callable_base> c; public: template <typename F> function(F f) { c.reset(new callable<F>(f)); } int operator()(double d) { return c(d); } };
에 대한 함수 포인터를 래핑하는 std::function의 간단한 예를 생각해 보세요. 이 예에서 std::function은 다형성 callable_base 유형에 고유한_ptr을 저장합니다. 다양한 펑터의 경우 callable_base에서 파생된 새 유형이 동적으로 생성되고 인스턴스화됩니다. std::function 객체는 힙에서 다양한 크기의 펑터를 수용하면서 일관된 크기를 유지합니다.
동적 디스패치 및 최적화
성능을 향상하기 위해 실제 구현 std::function은 동적 디스패치를 최적화하고 작은 객체 최적화를 활용합니다. 그러나 기본 개념은 동일합니다.
std::function 복사본의 동작
std::function의 복사본에는 캡슐화하는 호출 가능 개체의 복사본이 함께 제공됩니다. . 이는 다음 테스트로 확인됩니다.
int main() { int value = 5; typedef std::function<void()> fun; fun f1 = [=]() mutable { std::cout << value++ << '\n' }; fun f2 = f1; f1(); fun f3 = f1; f2(); f3(); }
상태를 공유하는 대신 함수 개체의 복사본이 만들어짐을 나타내는 출력 демонстрирует (5, 5, 6).
std::function의 구현에 대한 이러한 이해는 다양한 크기의 펑터와 함께 효율적인 사용을 보장합니다.
위 내용은 `std::function`은 가변 크기의 Functor를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!