본문 바로가기

C++

[C++] 이동 생성자와 이동 시맨틱(Move semantics)

이동 생성자란?

 

이름 없는 임시 객체가 생기는 것을 막을 수 없다. 그러나 무의미한 임시 객체의 생성은 프로그램의 효율을 떨어뜨린다. 이러한 문제 때문에 생긴 것이 이동 생성자이다. 임시 객체는 어차피 사라지는 객체이다. 깊은 복사를 수행할 필요 없이 얕은 복사를 수행함으로써 성능을 높일 수 있다.

 

#include <iostream>
using namespace std;

class TestClass
{
public:
	TestClass() { cout << "TestClass()" << endl; }
	~TestClass() { cout << "~TestClass()" << endl; }

	TestClass(const TestClass &ref)
		: num(ref.num)
	{ 
		cout << "TestClass(const TestClass &ref)" << endl;
	}

	//이동 생성자
	TestClass(const TestClass &&ref)
		: num(ref.num)
	{
		cout << "TestClass(const TestClass &&ref)" << endl;
	}
	TestClass& operator=(const TestClass&) = default;
	void SetNum(int param) { num = param; }

private:
	int num = 0;
};

TestClass TestFunc(int param)
{
	TestClass a;
	a.SetNum(param);

	return a;
}

int main()
{
	TestClass b;
	b = TestFunc(10);

	return 0;
}

 

결과값:

TestClass()
TestClass()
TestClass(const TestClass &&ref)
~TestClass()
~TestClass()
~TestClass()

 

b = TestFunc(10); 코드를 통해 이동 생성자가 호출된다. 만약 이동 생성자를 정의하지 않았다면 복사 생성자가 생성되어 깊은 복사를 수행할 것이다.