SW/C++

C++ : 이동대입연산자 : 개념, 예제, 활용방법

얇은생각 2020. 4. 26. 07:30
반응형

C++ : 이동대입연산자 : 개념, 예제, 활용방법

 

이동 대입 연산자

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

 

이동 생성자와 같은 개념입니다. 다른 개체 멤버 변수들의 소유권을 가져옵니다. 이것도 메모리 재할당을 하지 않습니다. 또 얕은 복사입니다.

 

 

 

STL 컨테이너용 이동 문법

C++11 이후로, STL 컨테이너에 이동생성자와 이동 대입이 생겼습니다. 그래서 따로 구현할 필요가 없어졌습니다. 

 

 

 

rvalue 최적화

새로운 프로그래밍 유행어 중 하나입니다. 이동생성자와 이동 대입 연산자는 유효한 내용입니다. 그러나 포인터 대신 개체 자체를 반환하는 함수에서 rvalue를 반환하는 것은 실제로는 매우 느리다고 합니다. 반환 값 최적화라고 하는 컴파일러 최적화를 깨뜨립니다. 

가장 좋은 방법은 기본적으로 그냥 개체를 반환해야 합니다. 더 빠라진다고 입증된 경우에만 함수가 rvalue를 반환하도록 바꾸어야 합니다.

 

 

 

#pragma once

#include <iostream>

using namespace std;

namespace samples
{
	class MyString
	{
	public:
		MyString() = delete;
		MyString(const char* str);
		MyString(const MyString& other);
		MyString(MyString&& other);
		virtual ~MyString();

		MyString& operator=(MyString&& other);
		const char* GetString() const;
		int GetSize() const;

		friend ostream& operator<<(ostream& os, const MyString& rhs);

	private:
		char* mString;
		int mSize;
	};
}

 

 

 

#include "MyString.h"

using namespace std;

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

	MyString::MyString(const MyString& other)
		: mSize(other.mSize)
	{
		cout << "Calling copy constructor" << endl;

		mString = new char[mSize];
		memcpy(mString, other.mString, mSize);
	}

	MyString::MyString(MyString&& other)
		: mString(other.mString)
		, mSize(other.mSize)
	{
		cout << "Calling move constructor" << endl;

		other.mString = nullptr;
		other.mSize = 0;
	}

	MyString::~MyString()
	{
		delete[] mString;
	}

	MyString& MyString::operator=(MyString&& other)
	{
		cout << "Calling move assignment" << endl;

		if (this != &other)
		{
			delete[] mString;

			mString = other.mString;
			mSize = other.mSize;

			other.mString = nullptr;
			other.mSize = 0;
		}

		return *this;
	}

	const char* MyString::GetString() const
	{
		return mString;
	}

	int MyString::GetSize() const
	{
		return mSize;
	}

	ostream& operator<<(ostream& os, const MyString& rhs)
	{
		for (int i = 0; i < rhs.mSize; i++)
		{
			os << rhs.mString[i];
		}
		
		return os;
	}
}
반응형