>백엔드 개발 >C++ >`std::function`은 가변 크기의 Functor를 어떻게 처리합니까?

`std::function`은 가변 크기의 Functor를 어떻게 처리합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-30 13:24:11420검색

How Does `std::function` Handle Functors of Variable Sizes?

std::function의 내부 구현

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.