C 언어
Cpp 언어
Kotlin
Android App
알고리즘
Git/CI/CD
RVO(Return Value Optimazation)
RVO란
C++에서 객체 생성 시, 임시객체를 통해 복사생성하는 경우가 많은데, 이를 최적화하여 임시객체 생성을 줄이기 위한 Compile Option이다.
c++ 11에서 표준으로 제정되어, 별도의 옵션 없이도 RVO가 적용된다.
NRVO(Named Return Value Optimazation)라는 개념도 있는데, 임시객체가 Name이 있느냐 없느냐의 차이뿐이고 동일하게 Optimization된다.

예제로 살펴보기
아래의 예제 코드를 통해서 살펴보도록 하자.
#include <iostream>
#include <string.h>

using namespace std;

class Obj {
    private:
        char objname[10];
        char *data;
    public:
        Obj(char *name) {
            strcpy(objname, name);
            cout << "[" << objname << "] create" << endl;
            data = new char[11];
            for (int i = 0; i < 10; i++) {
                data[i] = 'a' + i;
            }
            data[10] = 0;
        }

        Obj(const Obj &obj) {
            cout << "[" << obj.objname << "] is copied." << endl;
            strcpy(objname, obj.objname);
            data = obj.data;
        }

        ~Obj() {
            cout << "[" << objname << "] deleted" << endl;
            delete [] data;
        }
};


Obj getObj(char *name) {
    Obj temp(name);
    return temp;
}

int main() {
    Obj a("a");
    Obj b = Obj("b");
    Obj c = getObj("c");
    getObj("d");
    b = getObj("e");
    cout << "---end---" << endl;
    return 0;
}

위와 같이 있을 때 RVO 적용/미적용 여부에 따라 각 객체의 생성 시 호출되는 정보를 알아보자.
  RVO 적용 RVO 미적용
Obj a("a"); 임시객체 사용 없이 생성되므로 정상 생성 임시객체 사용 없이 생성되므로 정상 생성
Obj b = Obj("b"); Obj("b") 생성 시 컴파일러가 임시객체 생성하지 않고 바로 Obj b로 생성해 버림.(최적화 적용) Obj("b") 임시객체를 생성 후 복사생성됨. Obj("b") 임시객체는 삭제됨.
Obj c = getObj("c"); getObj() 호출 시 컴파일러가 Obj temp가 큰 변화 없이 바로 return되는 객체임을 알고 있음. 따라서 임시객체 생성하지 않고 바로 Obj c로 생성해 버림. (최적화 적용, temp 이름이 있어서 NRVO임) getObj() 안에서 temp 객체 생성됨. return되면서 임시객체를 temp객체로 복사생성 후 temp객체 삭제됨. Obj c를 임시객체로 복사생성 후 임시객체 삭제됨.
즉 여기서는 불필요하게 temp객체를 임시객체로, 임시객체를 c 객체로 2번이나 복사생성하고 있음.
b = getObj("e"); 이건 생성은 아니긴 함 추후 디버깅 추후 디버깅



RVO 옵션 Off하기
-fno-elide-constructors 옵션을 주면 RVO를 Off할 수 있다.

참조 자료
https://m.post.naver.com/viewer/postView.nhn?volumeNo=9735713&memberNo=559061
http://egloos.zum.com/himskim/v/3630181
https://qiita.com/zhupeijun/items/b8f7fe3bd604192a0b0c