문제

기능이 있다고 가정 해 봅시다.

typedef std::vector<int> VecType;
VecType randomVector();

int processing()
{
    VecType v = randomVector();
    return std::accumulate(v.begin(), v.end(), 0);
}

C ++ 0X는 구체적으로 가짜 사본이 RandomVector의 반환 값에서 피할 것이라고 말합니까? 아니면 컴파일러가 RVO를 구현해야합니까? 그것은 나에게 가치가 좋아 보인다 randomVector() RValue로 취급되어야하므로 V의 이동 생성자를 호출해야하지만 이것이 사실인지 확실하지 않습니다.

도움이 되었습니까?

해결책

규칙은 다음과 같습니다

  • 컴파일러가 RVO를 수행 할 수 있다면이를 수행 할 수 있으며 사본과 이동이 없습니다.
  • 그렇지 않으면 적절한 생성자가 취합니다.

당신이 말했듯이, 임시는 rvalue이므로 규칙 때문에 이동 생성자가 선택됩니다. 13.3.3.2/3, RValue 기준은 lvalue 기준보다 더 나은 rvalue에 결합한다고 말합니다. 이동 또는 카피 생성기 사용 여부를 결정할 때 과부하 해상도가 이동 생성자를 선호합니다.

컴파일러가 RVO를 수행 할 수 있다는 규칙은 12.8/15.

다른 팁

모든 반환 값은로 간주됩니다 rvalues 따라서 컴파일러 가이 경우 RVO를 구현하지 않으면 사본 생성자 대신 이동 생성자를 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top