방금 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으로 인해 정의되지 않은 동작이 발생하지 않도록 할 수 있습니까?
참고로 RVO 및 NRVO의 표준 용어는 [복사 생략]입니다 (http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –
@MattMcNabb 예 나는 그것을 지금 볼 수있다. 감사! – athos