728x90
반응형
질문 : C ++ 11 rvalue 및 이동 의미 혼란 (return 문)
rvalue 참조를 이해하고 C ++ 11의 의미를 이동하려고합니다.
이 예제의 차이점은 무엇이며 어떤 것이 벡터 복사를하지 않을까요?
1번째 예제
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> &&rval_ref = return_vector();
2번째 예제
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();
3번째 예제
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();
답변
1번째 예제
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> &&rval_ref = return_vector();
rval_ref
의해 포착 된 임시를 반환합니다. rval_ref
정의 이상으로 수명이 연장되며 마치 값으로 잡은 것처럼 사용할 수 있습니다. 이것은 다음과 매우 유사합니다.
const std::vector<int>& rval_ref = return_vector();
rval_ref
방식으로 rval_ref를 사용할 수 없다는 점을 제외하고.
2번째 예제
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();
두 번째 예에서는 런타임 오류를 생성했습니다. rval_ref
이제 함수 내에서 tmp
대한 참조를 보유합니다. 운이 좋으면이 코드는 즉시 충돌합니다.
3번째 예제
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
on tmp
는 불필요하며 반환 값 최적화를 방해하기 때문에 실제로 성능 비관적 일 수 있습니다.
수행중인 작업을 코딩하는 가장 좋은 방법은 다음과 같습니다.
모범 사례
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> rval_ref = return_vector();
즉, C ++ 03에서와 마찬가지로. tmp
는 return 문에서 암시 적으로 rvalue로 처리됩니다. 반환 값 최적화 (복사 없음, 이동 없음)를 통해 반환되거나 컴파일러가 RVO를 수행 할 수 없다고 결정한 경우 벡터의 이동 생성자를 사용하여 반환을 수행합니다 . RVO가 수행되지 않고 반환 된 유형에 이동 생성자가없는 경우에만 복사 생성자가 반환에 사용됩니다.
출처 : https://stackoverflow.com/questions/4986673/c11-rvalues-and-move-semantics-confusion-return-statement
728x90
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
ReSharper는 프로젝트가 빌드되는 경우에도 "Cannot resolve symbol" (0) | 2021.09.09 |
---|---|
C ++ 11에서 T && (&&)가 의미하는 것 (0) | 2021.08.04 |
C / C ++에 표준 부호 함수 (signum, sgn)를 사용하는 방법 (0) | 2021.08.04 |
#ifndef 및 #define이 C ++ 헤더 파일에서 사용되는 이유 (0) | 2021.08.04 |
C 또는 C ++를 사용하여 디렉토리의 파일 목록을 가져오는 방법 (0) | 2021.07.30 |