객체를 std::thread에 전달할 때 인수는 일반적으로 참조되지 않고 스레드에 복사됩니다. 이 동작은 참조로 전달하면 복사 생성을 피해야 한다는 기대와 모순됩니다. 혼란은 C의 참조와 포인터의 구별에서 비롯됩니다.
C에서 참조로 객체를 전달한다는 것은 일반적으로 주소를 전달하는 것을 의미하며, 이는 전달하는 것과 동일합니다. 포인터. 그러나 std::thread에는 인수를 값별로 복사해야 하는 특정 구현이 있습니다.
참조 의미 체계를 얻으려면 다음과 같이 std::reference_wrapper를 사용하세요.
std::thread newThread(session, &sock, std::ref(logger));
이렇게 하면 로거가 복사되지 않고 오히려 해당 참조가 스레드에 전달됩니다. 로거는 스레드보다 오래 지속되어야 합니다.
이 경우 std::thread에서는 인수가 복사될 것으로 예상하므로 std::move()를 사용하지 않는 것이 좋습니다. 객체를 이동하면 해당 메모리의 소유권이 스레드로 이전되므로 이는 바람직하지 않을 수 있습니다.
코드가 이전에 std::move()로 작업했지만 지금은 실패하는 경우 사용 중인 컴파일러 버전이 C 11을 완전히 구현하지 않습니다. 향상된 C 11 지원을 위해 컴파일러를 업데이트하는 것이 좋습니다.
위 내용은 std::thread에 대한 참조로 객체를 전달하면 복사 생성자가 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!