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 복사본은 상태를 공유하는 대신 내부 호출 가능 개체의 복사본을 트리거합니다. 이는 캡처된 변경 가능한 변수의 값이 증가하는 테스트에서 분명합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!