>  기사  >  백엔드 개발  >  std::thread에 대한 참조로 객체를 전달하면 복사 생성자가 호출되는 이유는 무엇입니까?

std::thread에 대한 참조로 객체를 전달하면 복사 생성자가 호출되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-15 08:17:02324검색

Why Does Passing an Object by Reference to std::thread Invoke the Copy Constructor?

std::thread: 참조에 의한 전달은 복사 생성자를 호출합니다

문제 이해

객체를 std::thread에 전달할 때 인수는 일반적으로 참조되지 않고 스레드에 복사됩니다. 이 동작은 참조로 전달하면 복사 생성을 피해야 한다는 기대와 모순됩니다. 혼란은 C의 참조와 포인터의 구별에서 비롯됩니다.

생성자 복사 및 참조로 전달

C에서 참조로 객체를 전달한다는 것은 일반적으로 주소를 전달하는 것을 의미하며, 이는 전달하는 것과 동일합니다. 포인터. 그러나 std::thread에는 인수를 값별로 복사해야 하는 특정 구현이 있습니다.

std::reference_wrapper 사용

참조 의미 체계를 얻으려면 다음과 같이 std::reference_wrapper를 사용하세요.

std::thread newThread(session, &sock, std::ref(logger));

이렇게 하면 로거가 복사되지 않고 오히려 해당 참조가 스레드에 전달됩니다. 로거는 스레드보다 오래 지속되어야 합니다.

의미 이동

이 경우 std::thread에서는 인수가 복사될 것으로 예상하므로 std::move()를 사용하지 않는 것이 좋습니다. 객체를 이동하면 해당 메모리의 소유권이 스레드로 이전되므로 이는 바람직하지 않을 수 있습니다.

코드가 이전에 std::move()로 작업했지만 지금은 실패하는 경우 사용 중인 컴파일러 버전이 C 11을 완전히 구현하지 않습니다. 향상된 C 11 지원을 위해 컴파일러를 업데이트하는 것이 좋습니다.

위 내용은 std::thread에 대한 참조로 객체를 전달하면 복사 생성자가 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.