> 백엔드 개발 > C++ > C 람다 표현식에서 이동을 통해 객체를 효율적으로 캡처하려면 어떻게 해야 합니까?

C 람다 표현식에서 이동을 통해 객체를 효율적으로 캡처하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2024-12-09 07:19:07
원래의
719명이 탐색했습니다.

How Can I Efficiently Capture Objects by Move in C   Lambda Expressions?

람다 표현식의 이동 캡처

소개

C에서는 rvalue 참조라고도 알려진 이동 캡처를 사용하여 개체의 소유권을 람다 식으로 효율적으로 이전합니다. 이 기술은 객체의 리소스를 람다 내에서 명시적으로 관리해야 하는 상황에서 특히 유용할 수 있습니다.

C 14의 일반화된 람다 캡처

C 14에서 일반화된 람다 캡처는 우아한 솔루션을 제공합니다. 이동 캡처용. 이 기능을 사용하면 이동 의미 체계를 사용하여 값별로 변수를 캡처하는 람다 식을 선언할 수 있습니다.

using namespace std;

auto u = make_unique<some_type>(some, parameters);  

go.run([u = move(u)] { do_something_with(u); });
로그인 후 복사

이 접근 방식은 u의 소유권을 람다로 이동하여 리소스가 적절하게 해제되도록 합니다. 또한 개체를 람다 밖으로 이동해야 하는 경우 람다는 변경 가능으로 선언되어야 합니다.

C 11의 이동 캡처에 대한 해결 방법

C 11에서는 이동 캡처가 직접적으로 수행되지 않습니다. 지원됩니다. 그러나 이 동작을 에뮬레이트할 수 있는 기술이 있습니다. 한 가지 접근 방식은 도우미 함수를 사용하여 rvalue 참조(rref)를 만드는 것입니다.

template <typename T>
struct rref_impl {
    rref_impl() = delete;
    rref_impl(T &&x) : x(std::move(x)) {}
    // ... (remaining implementation)
};

template<typename T> rref_impl<T> make_rref(T &&x) {
    return rref_impl<T>{std::move(x)};
}
로그인 후 복사

이 도우미 함수를 사용하면 람다에서 이동하여 개체를 캡처할 수 있습니다.

unique_ptr<int> p{new int(0)};
auto rref = make_rref(std::move(p));
auto lambda = [rref]() mutable -> unique_ptr<int> { return rref.move(); };
로그인 후 복사

캡처된 rvalue 참조를 수정할 수 있도록 람다는 변경 가능하도록 선언되었습니다.

일반화된 람다 에뮬레이션 C 11에서 캡처

C 11에서 일반화된 람다 캡처를 에뮬레이트하는 또 다른 접근 방식은 사용자 정의 클래스를 사용하여 변수를 캡처하고 이를 람다 밖으로 이동하는 방법을 제공하는 것입니다.

template <typename T, typename F>
struct capture_impl {
    T x;
    F f;
    // ... (remaining implementation)
};

template <typename T, typename F>
capture_impl<T,F> capture(T &&x, F &&f) {
    return capture_impl<T,F>(std::forward<T>(x), std::forward<F>(f));
}
로그인 후 복사

이 클래스는 이동으로 변수를 캡처하고 람다를 호출하는 방법을 제공하는 데 사용할 수 있습니다.

unique_ptr<int> p{new int(0)};
auto lambda = capture(std::move(p), [](unique_ptr<int> &p) { return std::move(p); });
로그인 후 복사

이전 클래스와 달리 접근 방식에서는 캡처된 유형이 복사 가능하지 않은 경우 이 람다를 복사할 수 없습니다. 이렇게 하면 람다 복사 시 발생할 수 있는 오류를 방지할 수 있습니다.

위 내용은 C 람다 표현식에서 이동을 통해 객체를 효율적으로 캡처하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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