2014-11-20 8 views
0

컴파일러가 NRVO (Named Return Value Optimization)를 수행 할 수 있으려면 함수 본문에서 다른 값보다 먼저 반환 값을 선언해야합니다. 나는 이것이 예외 상황에서 스택 해제의 순서로 인한 것 같지만 확실하지는 않습니다. 명명 된 반환 값이 함수 본문에서 처음 선언 된 이유는 무엇입니까?반환 값이 NRVO에 대해 처음으로 선언 된 로컬 일 필요가있는 이유는 무엇입니까?

class C{}; 
C f(){ 
    C ret; //NRVO possible 
    return ret; 
} 
C g(){ 
    int i; 
    C ret; //NRVO not possible? 
    return ret; 
} 

사용 사례 :

편집
auto c = f(); 
auto c2 = g(); 

: http://www.youtube.com/watch?v=fHNmRkzxHWs분 32:30이있을 수 있습니다 : 당신에게 내가이 이해를 돕는 모든 답변자 감사, 내가 여기 챈들러 Carruth의 문을 의심하기 시작하고 오해의 소지가 있거나 오해하는 것입니다. 반환 변수를 먼저 선언하는 것이 중요하지는 않습니다.

+3

이 제한을 부과하는 일부 * 컴파일러가 * 수 있지만, 일반적으로 이해는 단순히 결함이 -/비활성화 NRVO을 사용하지 않는 변수 정의 순서. –

+4

이 가설을 테스트 해 보셨습니까? 그렇다면 어떤 컴파일러를 사용합니까? – juanchopanza

+0

이 [오래된 링크] (http://msdn.microsoft.com/en-us/library/ms364057(v=80) .aspx) 도움이 될 수 있습니다. – anatolyg

답변

0

표준은 사본 추출과 관련하여 변수의 선언/정의 순서에 대한 요구 사항을 부과하지 않습니다. 표준에서 "구현은 이 허용"이 아니라는 점에 유의해야합니다. clang and gcc은 복사 제거가 발생하지만 MSVC은 발생하지 않음을 알 수 있습니다. 이는 구현 정의에 최적화 된 것입니다.

§12.8/31

복사 생략에 대해 설명

[...] 복사/이동 작업이 생략라는 복사 생략에 결합 될 수있다 (다음의 경우에 허용 ) 여러 복사본을 제거 :

을 - 클래스 반환 형식과 함수에서 return 문에 표현이 다른 비 휘발성 자동 객체의 이름 (있는 경우 함수 반환형 같은 CV-규정되지 않은 유형의 기능 또는 캐치 절 파라미터보다) 는 복사/ 이동 작업 함수의 리턴 값

직접 자동 오브젝트를 구성함으로써 생략 될 수있다 - 는 [..]