[C++기초] 16. 이동 생성자 및 이동 대입 연산자

INDEX

  1. rvalue와 복사생성자
  2. rvalue 참조, stdmove(), 이동생성자
  3. 이동 대입 연산자

rvalue와 복사생성자

값의 분류

lvalue란?

rvalue란?

과거 C++ 의 문제(C++11 이전)

image

복사를 어떻게 막을까?

rvalue 참조 (&&)

rvalue 참조, stdmove(), 이동생성자

예시 : rvalue참조

float CalculateAverage()
{
    float average;
    // ...
    return average;
}
int main()
{
    int number = 10;
    int&& rNumber = number; // 에러, number는 lvaule
    int&& rNumber1 = 10; // OK, 10은 rvalue
    float&& rAverage = CalculateAverage(); // OK, CaculateAverage()는 rvalue
}

std::move()

이동생성자

` ::(&&) `

예시 : MyString 이동 생성자

MyString.h

class MyString
{
public:
	MyString(MyString&& other); // 이동 생성자
	MyString(const MyString& other); // 복사 생성자
	MyString(const char* str);
	// ...
private:
	char* mString;
	int mSize;
};

MyString.cpp

// 이동 생성자
MyString::MyString(MyString&& other)
	: mString(other.mString)
	, mSize(other.mSize)
{
	other.mString = nullptr;
	other.mSize = 0;
}

// 복사 생성자
MyString::MyString(const MyString& other)
	: mSize(other.mSize)
{
	mString = new char[mSize];
	memcpy(mString, other.mString, mSzie);
}

MyString::MyString(const char* str)
	: mSize(strlen(str) +1)
{
	mString = new char[mSize];
	memcpy(mString, str, mSize);
}

Main.cpp

MyString studentName("Lulu");
MyString copiedName(studentName);
MyString copiedName2(std::move(studentName));
  • 이동 생성자를 사용함으로써 메모리 재할당을 막음

이동 대입 연산자

이동 대입 연산자

<class_name>& <class_name>::operator=(<class_name>&&)

예시 : 이동 대입 연산자

MyString.h

class MyString
{
public:
	MyString& operator=(MyString&& other);
	// ...
private:
	char* mString;
	int mSize;
};

MyStirng.cpp

MyString& MyString::operator=(MyString&& other)
{
	if(this != &other)
	{
		delete[] mString;
		mString = other.mString;
		mSize = other.mSize;
		other.mString = nullptr;
		other.mSize = 0;
	}
	return *this;
}

Main.cpp

MsString studnetName("Lulu");
MyString anotherStudentName("Teemo");
anotherStudentName = std::move(studnetName);

STL 컨테이너용 이동 문법

rvalue 최적화

베스트 프랙티스