반응형
이동 대입 연산자
<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;
}
}
반응형
'SW > C++' 카테고리의 다른 글
C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법 (0) | 2020.04.28 |
---|---|
C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점 (0) | 2020.04.27 |
C++ : lvalue, rvalue, move, 이동생성자 : 개념, 장점, 필요성 (0) | 2020.04.25 |
C++ : 템플릿 : 특수화, 장점과 단점, 베스트 프랙티스 (0) | 2020.04.24 |
C++ : 템플릿 함수 : Math 예제 구현해보기 (0) | 2020.04.23 |