> 백엔드 개발 > C++ > 가변 크기의 람다 표현식을 처리함에도 불구하고 std::function은 어떻게 고정 크기를 유지합니까?

가변 크기의 람다 표현식을 처리함에도 불구하고 std::function은 어떻게 고정 크기를 유지합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-04 17:01:15
원래의
636명이 탐색했습니다.

How Does std::function Maintain a Fixed Size Despite Handling Variable-Sized Lambda Expressions?

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); }
};
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은 힙의 다양한 펑터를 수용하면서 크기가 일정하게 유지됩니다.

최적화 기술은 작은 개체 최적화를 사용하고 간접 참조를 방지하는 등 이 체계를 더욱 구체화합니다. 그러나 개념적으로 핵심 아이디어는 동일합니다.

std::function의 복사본과 관련하여 실험적 증거에 따르면 호출 가능 개체의 독립적인 복사본이 제시됩니다. 인위적인 예:

int main() {
   int value = 5;
   typedef std::function<void()> fun;
   fun f1 = [=]() mutable { std::cout << value++ << '\n' };
   fun f2 = f1;
   f1(); // prints 5
   fun f3 = f1;
   f2(); // prints 5
   f3(); // prints 6 (copy after first increment)
}
로그인 후 복사

다양한 호출이 값을 독립적으로 증가시키기 때문에 출력은 공유 상태가 아닌 격리된 복사본을 나타냅니다.

위 내용은 가변 크기의 람다 표현식을 처리함에도 불구하고 std::function은 어떻게 고정 크기를 유지합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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