2012-06-28 2 views
18

C++ 11에서는 값으로 std::vector을 반환하는 것은 제정신이라고 종종 말합니다.std :: vector를 값으로 반환하기

C++ 03에서는 RVO가 복사본을 최적화해야하므로 대부분 그렇습니다. 그러나 이 대부분의 개발자를 겁 먹게해야합니다.

  • C++ 11에서 반환 된 std::vector 로컬 변수는 항상 이동됩니까?
  • 벡터가 로컬 변수 대신 로컬 변수의 멤버 일 경우 어떻게해야합니까?
  • 명백히 전역 변수를 반환하는 것은 이동되지 않습니다. 다른 어떤 경우에는 이동되지 않습니까?
+0

참고 사항 [이 질문에] (http://stackoverflow.com/q/9532608/500104). – Xeo

답변

15

먼저 사본을 제거 할 수있을 때마다 지금은 여전히 ​​생략 할 수 있으며 동일한 상황에서 이동을 생략 할 수 있습니다. 이 게시물의 나머지 부분에서는 필자가 elision이 어떤 이유로 든 발생하지 않는다고 가정하겠습니다. (컴파일러 작성자가 나쁜 방식으로 게으른 척하는 것).

C++ 11에서는 반환 된 std :: vector 로컬 변수가 항상 이동됩니까?

복사 추출 기준이 충족되거나 변수가 명시 적으로 std::move 일 때마다 d.

벡터가 로컬 변수 대신 로컬 변수의 멤버 일 경우 어떻게 될까요?

명시 적으로 이동하지 않으면 이동하지 않습니다. std::move d.

명백히 전역 변수를 반환하는 것은 이동되지 않습니다. 다른 어떤 경우에는 이동되지 않습니까?

복사 elision에 대한 기준이 충족되지 않고 변수가 명시 적으로 std::move d가 아닌 경우.

값으로 반환하지 않는 유효한 이유는 없습니다. 값이 자동으로 이동되지 않아도 std::move으로 강제로 반환 할 수 있기 때문에 값으로 반환하는 것이 좋습니다.

+0

RVO가 될 수 있다면 이동하지 않을 것이라고 생각합니다. – juanchopanza

+0

@juanchopanza 잘, 예, 이들 중 어느 것도 최적화를 방해하지 않습니다. –

+0

OK; 귀하의 첫 번째 요점은 복사 elion에 대한 기준이 충족 될 때마다 ** 이동 ** 될 것임을 암시하는 것으로 보입니다. – juanchopanza

8

C++ 11에서 반환 된 std::vector 지역 변수는 항상 이동됩니까? 지역 변수에 대한

, 심지어 값에 의한 매개 변수는, 컴파일러는 기준이있는 경우에도, 이동이나 복사도가 어떤 이유로 생략 할 수있는 경우 항상 시도이 (먼저 이동합니다 충족). 실패 할 경우,이 사본을 다시 시도합니다

§12.8 [class.copy] p32 복사 작업의 생략에 대한 기준을 충족하거나 소스 객체가 함수 매개 변수는 사실에 대한 저장이 충족 될

, 이고 복사 할 객체를 lvalue로 지정하면 객체의 값이 인 것처럼 복사의 생성자를 선택하는 오버로드 해상도가 먼저 수행됩니다.과부하 해결이 실패하거나 선택한 생성자의 첫 번째 매개 변수 유형이 객체 유형 (cv 한정 일 수 있음)에 대한 rvalue 참조가 아닌 경우 객체를 lvalue로 간주하여 다시 오버로드 확인이 수행됩니다. [참고 : 복사 제거가 수행되는지 여부에 관계없이이 2 단계 과부하 해결을 수행해야합니다. elision이 수행되지 않으면 호출 할 생성자를 결정하고 호출을 생략해도 선택한 생성자에 액세스 할 수 있어야합니다. -end note]

벡터가 로컬 변수 대신 로컬 변수의 멤버 일 경우 어떻게 될까요?

하위 개체는 복사 제거 기준을 충족하지 않으므로 이동을 시도하지 않습니다. (어떤 바보, 이럴이지만, 그게 지역의 경우 하위 객체가 완벽하게 정상적으로 이동 될 수 있기 때문에이 현재. 나는 두 연결해야한다고 생각하지 않는 방법입니다.) 분명히 전역 변수를 반환

것 옮기지 마라. 다른 어떤 경우에는 이동되지 않습니까?

참조는 분명히 이동되지 않습니다. 그것 이외에, 나는 정말로 다른 것을 생각할 수 없다.

+0

로컬에 대한 참조는 어떻게됩니까? 'std :: move'가 로컬 참조에서 호출되면 어떻게 될까요? –

+0

@deft_code : 참조 자체가 자동으로 이동되지 않습니다. 마지막 문장이 그 점에서 충분히 명확하지 않은 것처럼 보입니다. 'std :: move' 참조는 참조 된 객체를 움직일 것입니다. – Xeo

관련 문제