이동 시멘틱
- 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
}