이동 시멘틱

  • c++11에서 추가된 인스턴스화된 객체의 메모리의 소유권을 이전하는 기능
  • 이동 생성자(Move ctor), 이동 대입 연산자(Move Assignment operator)를 사용
  • 이동 시맨틱이 생겨난 이유는 이름 없는 임시 객체때문이다.
  • R-value 레퍼런스는 우측값 참조
  • 임시 객체가 생성됐을 때 부하를 최소화 하기 위한 문법

  • 이동 시멘틱은 원본 객체의 멤버를 null로 초기화 시켜, 소유권을 이전 함으로 메모리 릭을 막아줍니다.

  • 복제 생성자는 깊은 복사를 통해 원본과 똑같은 객체를 생성하는것입니다.

  • 복제가 아닌 소유권을 이전한다.
  • 그냥 STL move를 쓰면 값이 복사되고, 초기화 안됨

복제 생성자와 가장 큰 차이가 이동 생성자는 메모리 소유권 이전이기 때문에 얕은 복사를 하고, 원본을 null로 초기화 해버리는 것이고,
복제 생성자는 깊은 복사를 통해 원본과 똑같은 객체를 생성하는 것.

class dog
{
public:
    dog() :mWeight(0) {}
    dog(int kg) : mWeight(kg) {}
    dog(const dog &src) //복제 생성자
    {
        mWeight = src.mWeight;
        cout << "copy ctor" << endl;
    }
    dog(dog &&src)//이동 생성자
    {
        mWeight = src.mWeight;
        src.mWeight = 0;//null로 초기화 시켜, 메모리릭 방지
        cout << "move ctor" << endl;
    }
    dog& operator=(const dog& rhs)//대입 연산자
    {
        mWeight = rhs.mWeight;
        cout << "operator=" << endl;
        return *this;
    }
    dog& operator=(dog&& rhs) {//이동 대입 연산자
        mWeight = rhs.mWeight;
        rhs.mWeight = 0;//null로 초기화 시켜, 메모리릭 방지
        cout << "move operator=" << endl;
        return *this;
    }
    int mWeight;
};

dog fun()
{
    dog temp;
    return temp;
}


int main()
{
    dog a(5);
    dog b = a;          //복제 생성자
    dog c;
    c = a;              //대입 연산자
    c = dog(10);        //이동 대입 연산자, dog(10)으로 생성된 임시객체를 c로 이동
    dog d(move(c));     //이동 생성자, c의 메모리 소유권을 d로 이전

    return 0;
}
}

 

class Human
{
public:
    int age;
public:
    Human():age(0) {};
    Human(int iage) :age(iage) {};       
    Human(const Human& h) 
    {
        age = h.age;
    }

    Human(Human&& h)                    //이동대입 연산자
    {
        age = h.age;
        h.age = 0;                      //null로 초기화 시켜, 소유권을 이전 함
    }

    Human& operator = (const Human& h)  //대입연산자
    {
        age = h.age;
        return *this;
    }
    Human& operator = (Human&& h)       //이동 대입연산자
    {
        age = h.age;
        h.age = 0;                      //null로 초기화 시켜,  메모리릭 방지
        return *this;
    }
    ~Human() {};
};

void main()
{
    Human a;
    a = Human(33);         //이동대입연산자
    Human b(move(a));     //이동생성자         a는 0이 되고, b가 33

}

'프로그래밍 > C++' 카테고리의 다른 글

람다식  (0) 2019.04.29
함수 객체  (0) 2019.04.29
함수 포인터  (0) 2019.04.29
스마트포인터  (0) 2019.04.29
템플릿 <template>  (0) 2019.04.29

+ Recent posts