C++메모리와 자원 관리

move semantics 기본

복사 비용이 큰 객체를 더 효율적으로 옮기기 위한 C++ move semantics의 핵심 개념을 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

cpp
std::string name = "RefDock";
std::string target = std::move(name);

설명

  • move semantics는 복사 대신 자원 소유권을 넘겨 비용을 줄이는 현대 C++ 핵심 개념입니다.
  • std::move는 실제로 옮기는 함수라기보다, 해당 객체를 이동 가능한 값으로 취급해 달라는 표시입니다.
  • 문자열, 벡터처럼 내부 버퍼를 가진 타입에서 이동의 효과가 크게 나타납니다.
  • 이동 이후 원본 객체는 유효하지만, 값은 예측 가능한 상태라고 가정하지 않는 편이 좋습니다.

짧은 예제

cpp
#include <iostream>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> source{"A", "B", "C"};
    std::vector<std::string> target = std::move(source);

    std::cout << "target size = " << target.size() << "\n";
    std::cout << "source size = " << source.size() << "\n";
}

빠른 정리

항목설명
복사원본 내용을 새 객체에 그대로 복제
이동자원 소유권을 새 객체로 넘김
std::move이동 가능 값으로 취급하도록 캐스팅
큰 객체이동의 효율 이점이 큼
이동 후 객체파괴 가능하고 재할당 가능한 상태는 유지

주의할 점

std::move를 썼다고 해서 항상 성능이 좋아지는 것은 아닙니다. 이동 후 원본을 곧바로 다시 쓰는 코드는 오히려 읽기 어렵고 오류를 만들기 쉽습니다.