> 백엔드 개발 > C++ > `std::function`은 메모리와 호출 가능한 개체를 어떻게 관리합니까?

`std::function`은 메모리와 호출 가능한 개체를 어떻게 관리합니까?

Patricia Arquette
풀어 주다: 2024-12-01 02:51:17
원래의
825명이 탐색했습니다.

How Does `std::function` Manage Memory and Callable Objects?

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿