2016-07-07 3 views
6

내 이해에 따르면, 임시 생성 된 개체가있을 때 이동 생성자가 호출됩니다. 여기에 getA() 기능은 임시 객체를 반환하지만 내 프로그램은 이동 생성자에서 메시지를 인쇄되지 않습니다이동 생성자가 호출되지 않는 이유는 무엇입니까?

컴파일러는 인스턴스 obj을 최적화하고,하지 않고 호출자에게 직접 개체를 다시 보낼 수 있습니다
#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
    A() 
    { 
     cout<<"Hi from default\n"; 
    } 

    A(A && obj) 
    { 
     cout<<"Hi from move\n"; 
    } 
}; 

A getA() 
{ 
    A obj; 
    cout<<"from getA\n"; 
    return obj; 
} 

int main() 
{ 
    A b(getA()); 

    return 0; 
} 
+0

이동 생성자로 검색 중이므로 Google에서 해당 페이지로 연결되지 않습니다 –

답변

6

개념적 가치 복사 찍은.

반환 값 최적화 (NRVO)라는 이라고합니다. 컴파일러가 익명 ​​임시 값 복사본을 제거하기 위해 호출 할 수있는 고전적인 반환 값 최적화 (RVO)보다 더 적극적인 최적화입니다.

(콘솔 출력 부족)에서 부작용이 있어도 컴파일러는 을 수행 할 수 있습니다.

+0

속임수 대상에 문제가 있습니까? – NathanOliver

+0

NRVO가 아니라 RVO와 더 관련이 있습니다. IMHO는 꽤 정확한 경우에만 좋은 것입니다. – Bathsheba

+0

답변의 절반이 NRVO에 대한 이야기입니다. – NathanOliver

관련 문제