C 11 Unraveled의 Rvalue 참조 및 이동 의미 체계
C 11에서 rvalue 참조 및 이동 의미 체계는 성능과 효율성을 향상시키는 강력한 기술을 제공합니다. . 이 기사에서는 세 가지 예의 자세한 분석을 통해 이러한 개념의 미묘한 차이를 살펴봅니다.
첫 번째 예:
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector();
이 예에서 return_Vector 함수는 임시 값을 반환합니다. 값별 벡터 객체입니다. rvalue 참조 rval_ref는 이 임시 개체에 바인딩됩니다. 임시 개체의 수명은 함수 호출 이상으로 연장되어 rval_ref가 해당 데이터에 계속 액세스할 수 있습니다. 그러나 rval_ref를 통한 수정 사항은 원본 벡터에 영향을 주지 않습니다.
두 번째 예:
std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
이 예는 런타임 오류로 인해 결함이 있습니다. return_Vector 함수는 임시 벡터 tmp를 반환하기 전에 std::move를 사용합니다. 이는 효과적으로 tmp를 파괴하고 rval_ref가 유효하지 않은 메모리에 대한 참조를 보유하게 합니다. 결과적으로 이 코드는 실행 시 충돌이 발생할 수 있습니다.
세 번째 예:
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();
첫 번째 예와 유사하게 이 예에서는 임시 벡터에 std::move를 사용합니다. 값으로 반환하기 전에 tmp를 사용하세요. 그러나 함수가 이미 값으로 반환되므로 std::move는 중복되며 추가 메모리 작업으로 인해 성능이 저하될 수 있습니다.
모범 사례:
이 코드를 작성하는 가장 좋은 방법은 불필요한 std::move를 생략하고 그 대가로 C 11의 암시적 rvalue 변환에 의존하는 것입니다. 명령문:
std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> rval_ref = return_vector();
이 경우 컴파일러는 불필요한 복사 또는 이동을 제거하기 위해 반환 값 최적화(RVO)를 사용하여 반환을 최적화합니다. 또는 RVO가 가능하지 않은 경우 컴파일러는 벡터 클래스의 이동 생성자를 사용하여 효율적인 소유권 이전을 수행합니다.
위 내용은 Rvalue 참조 및 이동 의미 체계는 어떻게 C 11 성능을 향상합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!