성능을 원하면 저장하는 경우 값을 기준으로 전달하십시오.
"UI 스레드에서 실행"이라는 기능이 있다고 가정하십시오.
std::future<void> run_in_ui_thread( std::function<void()> )
"ui"스레드에서 일부 코드를 실행 한 다음 future
완료되면 신호를 보냅니다 . (UI 스레드가 UI 요소를 엉망으로 만드는 UI 프레임 워크에서 유용합니다)
고려중인 두 가지 서명이 있습니다.
std::future<void> run_in_ui_thread( std::function<void()> ) // (A)
std::future<void> run_in_ui_thread( std::function<void()> const& ) // (B)
이제 다음과 같이 사용할 것입니다.
run_in_ui_thread( [=]{
// code goes here
} ).wait();
익명 클로저 (람다)를 생성하고 std::function
그것을 닫고, run_in_ui_thread
함수에 전달한 다음 메인 스레드에서 실행이 끝날 때까지 기다립니다.
(A)의 경우, std::function
는 람다에서 직접 생성 된 다음 run_in_ui_thread
. 람다는move
들어가므로 std::function
, 어떤 이동 가능한 상태라도 효율적으로 들어간다.
두 번째 경우, 임시 std::function
가 생성되고 람다는 move
그 다음에 임시로 생성됩니다.std::function
는에서 참조로 사용됩니다 run_in_ui_thread
.
지금까지는 두 가지가 동일하게 수행됩니다. 를 제외하고 run_in_ui_thread
함수 인수의 사본을 작성하여 ui 스레드로 보내 실행하십시오! (완료되기 전에 반환되므로 참조를 사용할 수는 없습니다). 사례 (A)의 경우, 우리는 단순히move
std::function
장기 저장에. (B)의 경우을 복사해야합니다 std::function
.
그 가게는 가치를 더 잘 전달합니다. 의 사본을 저장할 가능성이 있으면 std::function
값으로 전달하십시오. 그렇지 않으면, 어느 쪽의 방법은 대략 동등합니다 : 값을 기준으로 한 유일한 단점은 같은 부피가 큰 경우입니다std::function
를 가지고 다른 하위 메소드를 사용한 후에 하나의 하위 메소드를 갖는 경우입니다. 그것을 막는 것은 a move
만큼 효율적 const&
입니다.
이제 둘 사이에 다른 상태가 있습니다. std::function
있습니다.
std::function
상점이 일부 객체를 저장 한다고 가정하십시오 .operator() const
하지만 는mutable
수정하는 데이터 멤버 (무례합니다!).
이 std::function<> const&
경우mutable
수정 된 데이터 멤버는 함수 호출에서 전파됩니다. 이 std::function<>
경우에는 그렇지 않습니다.
이것은 비교적 이상한 코너 사례입니다.
std::function
무게가 가볍고 저렴하게 움직일 수있는 다른 유형과 같이 취급하려고 합니다. 이동이 저렴하고 복사 비용이 많이들 수 있습니다.
sizeof(std::function)
초과하지 않을 것으로 예상 합니다2 * sizeof(size_t)
.