[cpp] std::move

minjubyeon·2025년 5월 19일

cpp

목록 보기
3/26
std::string str3("Programming"), str5("OOP");
std::string str4, str6;
str4 = std::move(str3); // move assignment operator,std::move

→ std::move(str3)는 str3을 rvalue reference로 캐스팅하여 str4에 move한다.

1. 할당이 아니라 move(이동)인 이유

여기서는 단순히 값을 복사하거나 할당하는 것이 아니라 동적 메모리 자원을 이동하고 기존 자원을 해제하거나 소유권을 바꾸는 등 복잡한 작업이 일어나기 때문이다.



2. 복사와 이동의 차이

복사는 느리고 리소스를 많이 쓰지만,
이동은 메모리 재사용만 하므로 빠르고 효율적이다.

구분복사(Copy)이동(Move)
개념값을 복제하여 새 객체에 담는다값의 소유권을 넘긴다, 복제 없음
원본 객체여전히 원본 데이터 보유원본 데이터는 비워지거나 "비정의 상태"가 됨
비용비쌈 (메모리 할당 + 데이터 복사)빠름 (포인터만 옮김)
함수operator=(const T&)operator=(T&&)


📦 비유로 이해하기

  • 복사 (Copy):
    당신이 책을 친구에게 주고 싶어서 복사해서 새 책을 줌
    → 당신도 원래 책을 가지고 있고, 친구도 똑같은 책을 가짐

  • 이동 (Move):
    당신이 책을 그냥 친구에게 줌
    → 당신은 책이 없어짐, 친구만 가짐



📦 예제로 비교

std::string a = "hello";
std::string b;
b = a;  // 복사 대입

→ a의 "hello" 내용을 새로 복사해서 b에 넣음
→ a와 b는 둘 다 "hello"를 가짐 (별도 메모리)

std::string a = "hello";
std::string b;
b = std::move(a);  // 이동 대입

→ a가 갖고 있던 "hello"의 메모리 자체를 b로 넘김
→ a는 비어 있거나 사용하면 안 되는 상태가 됨
→ 메모리 복사 없이 포인터만 이동함 → 매우 빠름



3. rvalue reference로 캐스팅하는 과정이 꼭 필요한 이유

std::move(str3)로 rvalue reference로 캐스팅하지 않으면,
C++은 절대로 move assignment를 사용하지 않고, 무조건 복사한다.

std::string str3 = "Hello";
std::string str4;
str4 = str3;           // ❌ 복사 대입 (copy assignment)
str4 = std::move(str3); // ✅ 이동 대입 (move assignment)

str3은 lvalue → 복사 대입 호출됨
std::move(str3)는 rvalue reference 표현식 → 이동 대입 호출됨


+) C++의 대입 연산자 오버로드:

class string {
public:
    string& operator=(const string& rhs);  // 복사 대입
    string& operator=(string&& rhs);       // 이동 대입
};

str3 자체는 const string&에 해당 → 복사 대입 사용됨
std::move(str3)로 string&&이 되면 → 이동 대입이 호출됨


+) std::move(str3)는 실제로 이동 하나요?

이동하지 않음. 단지 캐스팅만 함. 이동은 대입 연산자에서 일어남.

profile
안녕하세요.

0개의 댓글