KoreanFoodie's Study

C++ 기초 개념 12-1 : 우측값, 이동 생성자와 우측값 레퍼런스 본문

Tutorials/C++ : Beginner

C++ 기초 개념 12-1 : 우측값, 이동 생성자와 우측값 레퍼런스

GoldGiver 2022. 4. 19. 10:22

좌측값과 우측값

C++에서, 값은 대체로 우측값과 좌측값으로 나뉘어진다. (더 구체적인 분류는 이곳을 참조)

좌측값은 '이름'을 가지고 있는 녀석, 우측값은 '이름'이 없는 녀석이다.

 

이동 생성자와 우측값 레퍼런스

클래스에서 생성자를 호출한다고 해 보자. 만약 클래스가 String 변수값을 가지고 있다면, 이미 생성된 변수 a를 이용해 b를 만든다고 할 때 String 값을 매번 새로 생성하는 것은 메모리 낭비이다.

새로운 String을 담을 메모리를 할당하는 대신, 포인터를 전달함으로써 효율적으로 값을 옮기며 클래스 객체를 생성할 수 있는데, 이때 이동 생성자를 사용한다. 이동 생성자는 아래와 같은 형식을 가진다.

우측값 레퍼런스의 경우, typename && var 같은 형식으로 표현되는데, 이때 &&를 붙여 줌으로써 좌측값 변수를 우측값처럼 사용할 수 있음을 명시해 줄 수 있다. (타입 캐스팅으로 생각하는 것이 편하다)

MyString::MyString(MyString && str) noexcept {
    string_content = str.string_content;
    // ... Do Something
    
    // nullptr로 가리킴으로써 메모리가 해제되지 않도록 한다.
    str.string_content = nullptr;
}

이동 생성자가 호출되는 와중에 Exception이 발생하면, 기존 값들이 옮겨지는 도중에 작업이 멈추어 전달하고자 하는 값이 깨지는 상황이 발생할 수 있으므로, noexcept를 붙여 주어야 한다.

실제로, vector에서는 noexcept가 붙어 있어야 이동 생성자를 실제로 호출한다.

 

 
Comments