2014-12-31 10 views
0

방금 ​​RVO ​​(Return Value Optimization) 및 NRVO (Named Return Value Optimization)에 대해 읽었습니다. 다음은 두 가지 예입니다.C++ : RVO, NRVO 및 반환 로컬 객체

//Example of RVO 
Bar Foo() 
{ 
    return Bar(); 
} 

//Example of NVRO 
Bar Foo() 
{ 
    Bar bar; 
    return bar; 
} 

이는 훌륭한 컴파일러 최적화입니다. 그러나, 나는 (CH 6.3.2) "절대로 로컬 개체에 대한 참조 또는 포인터를 반환하지 않습니다"고 스탠리 리프만의 "C++ 프라이머"읽기, 예제 코드는

//disaster: this function returns a reference to a local object 
const string &manip() 
{ 
    string ret; 
    // transform ret in some way 
    if (!ret.empty()) 
     return ret; // WRONG: returning a reference to a local object! 
    else 
     return "Empty"; // WRONG: "Empty" is a local temporary string 
} 

나는 그것을 얻지 않는다는,이다 이 예제는 어디에서 RVO 예제와 다른가요? 동일하면 컴파일러가 RVO 최적화를 수행 할 수 있도록 어떻게 호출 스택 unwinding으로 인해 정의되지 않은 동작이 발생하지 않도록 할 수 있습니까?

+0

참고로 RVO 및 NRVO의 표준 용어는 [복사 생략]입니다 (http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

+0

@MattMcNabb 예 나는 그것을 지금 볼 수있다. 감사! – athos

답변

3

이들은 다릅니다.

Bar Foo(); 

값으로 돌아 오면 로컬 개체가 복사됩니다.

const string &manip(); 

참조로 돌아 오면 로컬 개체 자체가 반환되며 함수가 반환 할 때 참조가 유효하지 않습니다.

+0

@ab Ah! 당신 말이 맞아요! 나는 "&"세부 사항을 놓쳤다. – athos

+0

@athos 여기 있습니다. – 4pie0