>백엔드 개발 >C++ >다양한 크기의 호출 가능 항목을 래핑함에도 불구하고 `std::function`이 어떻게 고정 크기를 달성합니까?

다양한 크기의 호출 가능 항목을 래핑함에도 불구하고 `std::function`이 어떻게 고정 크기를 달성합니까?

DDD
DDD원래의
2024-12-02 06:01:10724검색

How Does `std::function` Achieve Fixed Size Despite Wrapping Callables of Varying Sizes?

std::function 구현 방법: 유형 삭제 및 힙 할당

std::function의 주요 구현 세부 사항은 기능입니다. 람다 표현식을 포함하여 모든 호출 가능 항목을 래핑합니다. 람다의 크기는 다양하지만 std::function은 고정된 크기를 유지합니다. 이는 유형 삭제라는 기술을 통해 달성됩니다.

std::function의 간단한 예를 들어보세요:

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); }
};

여기서 std::function은 기본 callable_base 유형에 대한 고유한_ptr입니다. 사용된 각 고유 펑터에 대해 호출 가능한 파생 유형 힙에서 동적으로 생성되고 인스턴스화됩니다. 이렇게 하면 std::function 객체가 일정한 크기를 유지하면서 모든 호출 가능 개체를 래핑할 수 있습니다.

std::function 복사본은 상태를 공유하는 대신 내부 호출 가능 개체의 복사본을 트리거합니다. 이는 캡처된 변경 가능한 변수의 값이 증가하는 테스트에서 분명합니다.

int value = 5;
std::function<void()> f1 = [=]() mutable { std::cout << value++ << '\n'; };
std::function<void()> f2 = f1;
// Prints 5
f1();
// Prints 5 (copy of mutable state)
f2();

따라서 std::function은 유형 삭제 및 힙 할당을 사용하여 다양한 크기의 호출 가능 항목을 효율적으로 래핑합니다. 힙 할당은 래핑된 호출 가능 항목을 기반으로 동적 유형을 인스턴스화하는 데 사용되어 std::function 자체의 고정 크기를 보장합니다.

위 내용은 다양한 크기의 호출 가능 항목을 래핑함에도 불구하고 `std::function`이 어떻게 고정 크기를 달성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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