프로그래밍 언어/C++

C ++ 11 rvalue 및 이동 의미 혼란 (return 문)

Rateye 2021. 8. 4. 10:52
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
반응형