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