눈팅하는 게임개발자 블로그
RVO(Return Value Optimization) 본문
RVO는
컴파일러에 의해 최적화되는 반환값이다.
다음 코드를 한 줄씩 실행하면서 살펴보자.
#include <iostream>
class Foo {
public:
Foo(const std::string& name)
: name(name)
{
}
~Foo() = default;
Foo(const Foo& rhs)
: name(rhs.name)
{
}
Foo& operator=(const Foo& rhs) {
name = rhs.name;
return *this;
}
private:
std::string name;
};
Foo NRVOFunc(const std::string& name) {
Foo foo(name);
return foo;
}
Foo RVOFunc(const std::string& name) {
return Foo(name);
}
int main() {
Foo foo = NRVOFunc("foo1");
Foo foo2 = RVOFunc("foo2");
std::cout << "---end---" << std::endl;
return 0;
}
출처 : dydtjr1128.github.io/cpp/2019/08/10/Cpp-RVO(Return-Value-Optimization).html
우선 main 함수의 첫 번째 라인인 Foo foo = NRVOFunc("foo1");를 먼저 실행.
NRVOFunc 함수로 넘어와서 Foo foo(name)코드를 실행한다.
이후 string을 매개변수로 받는 생성자 실행.
그리고 return foo; 라인을 실행하면.
Foo의 복사 생성자가 실행된다.
이는 Main 함수의 첫 번째 라인의 변수인 foo에 NRVOFunc 함수의 반환값이 대입되면서 실행되는 것이다.
해당 라인이 실행되는 경로는 다음과 같다.
반면 RVOFunc에서는 함수 내부에서 foo라는 변수를 생성할 필요가 없기 때문에
복사 생성자가 생성되지 않고 한 번의 생성자로만 Foo 객체가 반환된다.
해당 라인이 실행되는 경로는 다음과 같다.
같은 결과를 나타내지만 RVOFunc 쪽은 복사생성자를 호출하지 않으므로 그만큼
자원이 낭비되지 않고 처리 속도가 빠르다.
하지만 해당 코드를 Release 모드에서 돌리면
NRVOFunc 또한 복사생성자를 호출하지 않고
한 번의 기본생성자만 호출한다.
이는 Release 모드에서의 컴파일러가 자동적으로 최적화를 해주기 때문이다.
'공부한거 > Cpp' 카테고리의 다른 글
스마트 포인터와 일반 포인터의 성능 차이 (0) | 2020.11.12 |
---|---|
RAII(Resource Acquisition is Initialization) (0) | 2020.10.01 |