2014-11-17 3 views
0

반환 값 최적화는 다음 예제에서 발생합니까? (아마도 컴파일러에 의존하는 질문. 어떤 경우에는 내가 최근 그 소리/GCC와 같은 "전형적인"현대 컴파일러에 대한 궁금하네요 가정합니다.)중첩 범위에서의 반환 값 최적화

Blah factory() { 
    return Blah(); 
} 

void func() { 
    Blah blah; 
    if (condition) { 
    blah = factory(); 
    blah.DoSomething(); 
    } else { 
    blah = factory(); 
    blah.DoSomethingElse(); 
    } 
    blah.DoOneMoreThing(); 
} 

을 내가 명시 적으로 같은 라인에서 개체를 구성하고 있지 않다 알고 팩토리 함수를 호출하는 것으로 충분하지만 위의 예에서 충분히 똑똑한 컴파일러가 확실히 복사를 최적화 할 수 있습니다 (factory()으로 설정하기 전에 인스턴스 blah을 건드리지 않았기 때문에).

RVO가 실제로 발생하지 않으면 변경하지 않고 복사본을 피할 수있는 방법이 있습니까? factory?

+2

이 코드는 매우 익숙합니다 (https://www.youtube.com/watch?v=3taEuL4EHAg). –

+1

이유 :'Blah x = factory(); if (condition) {x.f(); } else {x.g(); } x.h();'? –

+0

나는 최근에 매우 비슷한 질문을했다. http://stackoverflow.com/questions/26959846/move-semantics-in-eigen 그리고 당신이 copy-and-swap copy ctor를 구현하면 괜찮을 것 같다. 확실히 당신이'Blax x = factory();라고 쓰면 copy elision이 시작될 것입니다. – vsoftco

답변

1

Blah blah;은 부작용이있을 수있는 기본 생성자 (예 : 메시지 인쇄 또는 뮤텍스 잠금)를 호출하고 C++ 컴파일러가 해당 최적화를 허용하지 않기 때문에 프로그램에서 반환 값 최적화가 수행되지 않습니다. 떨어져. blah이 기본값으로 생성 되 자마자 아래 할당에서 다시 구성 할 수는 없지만 반환 값 최적화를 위해서는 생성이 필요합니다.

그러나 생성자 및 할당 연산자 정의를 컴파일러에서 사용할 수있는 경우 생성 된 코드가 최적화되어 최종적으로 복사 생성자가 종료 될 수 있습니다. 그러나 이것은 보장되지 않습니다.