값으로 반환해야합니다.
이 표준에는 가치 반환의 효율성을 향상시키는 특정 기능이 있습니다. 이를 "복사 제거"라고하며 더 구체적으로이 경우에는 "명명 된 반환 값 최적화 (NRVO)"라고합니다.
컴파일러는 그것을 구현하지 않지만, 다시 컴파일러는하지 않습니다 가 인라인 기능을 구현하기 위해 (또는 전혀 최적화를 수행). 그러나 컴파일러가 최적화하지 않고 모든 심각한 컴파일러가 인라인 및 NRVO (및 기타 최적화)를 구현하면 표준 라이브러리의 성능이 상당히 떨어질 수 있습니다.
NRVO가 적용되면 다음 코드에 복사가 없습니다.
std::vector<int> f() {
std::vector<int> result;
... populate the vector ...
return result;
}
std::vector<int> myvec = f();
그러나 사용자는 이것을 원할 수 있습니다.
std::vector<int> myvec;
... some time later ...
myvec = f();
복사 제거는 초기화가 아닌 할당이기 때문에 여기서 복사를 방지하지 않습니다. 그러나 여전히 값으로 반환 해야 합니다. C ++ 11에서 할당은 "이동 의미론"이라는 다른 것에 의해 최적화됩니다. C ++ 03에서 위의 코드는 복사를 일으키며 이론적으로 는 최적화 프로그램이이를 피할 수 있지만 실제로는 너무 어렵습니다. 따라서 대신 myvec = f()
C ++ 03에서 다음과 같이 작성해야합니다.
std::vector<int> myvec;
... some time later ...
f().swap(myvec);
사용자에게보다 유연한 인터페이스를 제공하는 또 다른 옵션이 있습니다.
template <typename OutputIterator> void f(OutputIterator it) {
... write elements to the iterator like this ...
*it++ = 0;
*it++ = 1;
}
그런 다음 기존 벡터 기반 인터페이스를 지원할 수도 있습니다.
std::vector<int> f() {
std::vector<int> result;
f(std::back_inserter(result));
return result;
}
기존 코드가 고정 된 양보다 더 복잡한 방식으로 사용하는 경우 기존 코드보다 효율성 이 떨어질 수 있습니다 reserve()
. 그러나 기존 코드가 기본적으로 push_back
벡터를 반복적 으로 호출 하는 경우이 템플릿 기반 코드도 마찬가지로 좋습니다.
f
어떻습니까?