본문 바로가기
프로그래밍 언어/C++

C++ 11 / Rvalue 참조

by Nighthom 2023. 2. 15.

C++ 11 이전의 참조는 상수가 아닐 경우 lvalue만, 

상수일 경우 lvalue, rvalue 모두 받을 수가 있었다. 하지만, 이를 활용해서 생성한 복사 생성자는 임시 객체에 대한 복사도 전부 수행하기 때문에 굉장히 성능적으로 비효율을 감수해야 했다.  

 

C++ 11부터 이러한 성능적인 이슈를 해결하기 위해  rvalue에 대한 참조를 지원한다.

class A {
public:
    A(A &&rhs) {
        string = rhs.string;
        length = rhs.length;
        
        rhs.string = nullptr;
    }
    
    ~A() {
        if(string) delete[] string;
     }

private:
    char* string;
    int length;
};

위는 Rvalue 참조를 사용하는 예제이다. 기존의 참조를 활용한 복사 생성자는 string에 대해서 메모리를 재할당하고, 문자열을 복사해서 담는 문제가 있었다. 하지만 rvalue 참조를 활용한 이동 생성자는 그냥 포인터만 이동시켜주면 끝이다. 그리고 기존 임시 객체가 소멸될 때 delete[]를 수행하지 않도록 기존 임시 객체의 string에는 nullptr을 넣어주기만 하면 double free bug 또한 발생하지 않게 된다. 

댓글