2017-03-13 8 views
2

http://coliru.stacked-crooked.com/a/c795a5d2bb91ae32C++ RVO : 언제 발생합니까? <code>return a;</code> 대신 <code>return std::move(a);</code> :

#include <iostream> 
struct X { 
    X(const char *) { std::cout << 1; } 
    X(const X &) { std::cout << 2; } 
    X(X &&) { std::cout << 3; } 
}; 
X f(X a) { 
    return a; 
} 
X g(const char * b) { 
    X c(b); 
    return c; 
} 

int main() { 
    f("hello"); // 13 
    g("hello"); // 1 
} 

기능 f(X a)의 마지막 줄에 어떤 차이가 있나요?

f에는 RVO가없고 g에는 NRVO가 있습니까?

+4

IIRC를 사용하여'return std :: move (a); '를 사용합니다. foils RVO; true RVO는 이동자도 복사 생성자도 포함하지 않지만 'std :: move (a)'는 NRVO에 대한 규칙을 위반했기 때문에 건설이 필요하다는 것을 의미합니다. – ShadowRanger

+1

Stephan T. Lavavej가 "Do not help the Compiler"라는 말에서 이것을 설명합니다 – tkausl

+0

질문 당 한 가지 질문하십시오. –

답변

3

함수 f (X a)의 마지막 줄에는 어떤 차이가 있습니까? return std :: move (a) 대신에?

번호 a은 함수의 지역 변수이므로, return a은 그곳에서 이동할 수 있습니다.

f에는 RVO가없고 g에는 NRVO가 있습니까?

수정. 명명 된 elision은 함수 매개 변수에 적용되지 않습니다. 함수 매개 변수가 아닌 지역 변수에만 적용됩니다.