std::function: 구현 및 메모리 관리
std::function 클래스는 호출 가능 객체에 대한 일반 래퍼 역할을 하여 호출 가능한 유형의 저장 및 호출. 람다 표현식은 함수 호출 연산자를 사용하여 클래스로 구현되는 경우가 많지만 참조되는 변수의 수에 따라 크기가 크게 달라질 수 있습니다.
반대로 std::function은 다양한 종류의 호출 가능 항목을 수용하면서 고정된 크기를 유지해야 합니다. , 람다 포함. 구현은 호출 가능한 엔터티를 나타내는 기본 클래스 생성을 포함하는 유형 삭제에 의존합니다. std::function과 함께 사용되는 각 특정 호출 가능 유형에 대해 파생 클래스가 생성되고 동적으로 인스턴스화됩니다.
예를 들어 double-to-int 함수에 대한 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) {} int operator()(double d) { return functor(d); } };
std::function 객체에는 기본 클래스에 대한 Unique_ptr이 포함됩니다. std::function이 특정 호출 가능 항목으로 생성되면 파생 클래스가 생성되고 힙에서 인스턴스화됩니다. std::function 객체 자체는 고정된 크기로 유지되지만 호출 가능 객체에 대한 메모리는 동적으로 할당됩니다.
복사 의미 체계와 관련하여 각 std::function 객체는 호출 가능 엔터티의 자체 복사본을 유지합니다. 이는 다음 테스트에서 분명하게 드러납니다.
fun f1 = [=]() mutable { std::cout << value++ << '\n' }; fun f2 = f1; f1(); f2(); f3();
프로그램 출력에서는 f2와 f3이 각각 별도의 호출 가능 개체를 유지하여 서로 다른 증분 값이 인쇄되는 것을 보여줍니다. 따라서 std::function은 호출 가능한 객체에 대한 메모리를 관리하는 동시에 std::function 객체의 복사본이 독립적인 호출 가능한 엔터티를 유지하도록 보장합니다.
위 내용은 `std::function`은 메모리와 호출 가능한 개체를 어떻게 관리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!