-
[C++] 이동 의미론(Move Semantics)프로그래밍/C & C++ 2024. 7. 5. 18:05728x90반응형
이동 의미론 (Move Semantics)은 C++11에서 도입된 개념으로, 자원의 불필요한 복사를 방지하고 성능을 최적화하기 위해 도입되었습니다. 이동 의미론은 객체의 소유권을 이전하는 방식으로, 복사보다 더 효율적으로 자원을 관리할 수 있습니다. 이를 위해 C++11에서는 이동 생성자와 이동 할당 연산자를 도입하였습니다.
1. 배경
기존의 C++에서는 객체를 다른 객체로 복사할 때, 깊은 복사(deep copy)를 사용하여 객체의 모든 자원을 복사해야 했습니다. 이는 특히 동적 메모리를 사용하는 객체의 경우 성능상 큰 부담이 될 수 있습니다. 이동 의미론은 이러한 문제를 해결하기 위해 설계되었습니다.
2. 이동 생성자 (Move Constructor)와 이동 할당 연산자 (Move Assignment Operator)
이동 생성자와 이동 할당 연산자는 객체의 자원을 복사하지 않고 이동시키는 역할을 합니다. 이동된 객체는 더 이상 원래 자원을 소유하지 않으며, 새로운 객체가 자원의 소유권을 가지게 됩니다.
이동 생성자
이동 생성자는 객체가 다른 객체로 이동될 때 호출됩니다. 이동 생성자는
&&
(rvalue reference) 를 매개변수로 받습니다.예시:
#include <iostream> #include <utility> class MyClass { public: int* data; // 기본 생성자 MyClass() : data(new int[10]) { std::cout << "Constructed" << std::endl; } // 소멸자 ~MyClass() { delete[] data; std::cout << "Destroyed" << std::endl; } // 이동 생성자 MyClass(MyClass&& other) noexcept : data(other.data) { other.data = nullptr; // 원래 객체의 포인터를 nullptr로 설정 std::cout << "Moved" << std::endl; } }; int main() { MyClass obj1; MyClass obj2 = std::move(obj1); // 이동 생성자 호출 return 0; }
이동 할당 연산자
이동 할당 연산자는 객체가 다른 객체로 이동할 때 호출됩니다. 이동 할당 연산자도
&&
(rvalue reference) 를 매개변수로 받습니다.예시:
#include <iostream> #include <utility> class MyClass { public: int* data; // 기본 생성자 MyClass() : data(new int[10]) { std::cout << "Constructed" << std::endl; } // 소멸자 ~MyClass() { delete[] data; std::cout << "Destroyed" << std::endl; } // 이동 생성자 MyClass(MyClass&& other) noexcept : data(other.data) { other.data = nullptr; // 원래 객체의 포인터를 nullptr로 설정 std::cout << "Moved" << std::endl; } // 이동 할당 연산자 MyClass& operator=(MyClass&& other) noexcept { if (this != &other) { delete[] data; // 기존 자원 해제 data = other.data; // 자원 이동 other.data = nullptr; // 원래 객체의 포인터를 nullptr로 설정 } std::cout << "Move Assigned" << std::endl; return *this; } }; int main() { MyClass obj1; MyClass obj2; obj2 = std::move(obj1); // 이동 할당 연산자 호출 return 0; }
3. 이동 의미론의 장점
- 성능 향상: 자원을 복사하지 않고 이동시키기 때문에, 특히 큰 데이터 구조를 다룰 때 성능이 크게 향상됩니다.
- 메모리 효율성: 불필요한 메모리 할당과 해제를 줄일 수 있습니다.
- 명확한 소유권: 이동 후 원래 객체는 자원을 더 이상 소유하지 않으므로, 자원의 소유권이 명확해집니다.
4. 이동 의미론을 사용하는 상황
- 벡터와 같은 컨테이너: 요소를 추가하거나 제거할 때 이동 의미론을 사용하여 효율적으로 처리할 수 있습니다.
- 임시 객체: 함수 반환 값 등 임시 객체의 자원을 효율적으로 처리할 수 있습니다.
- 리소스 관리 객체: 파일 핸들, 소켓 등 리소스를 관리하는 객체에서 이동 의미론을 사용하면 효율적입니다.
이동 의미론은 C++에서 성능과 자원 관리를 최적화하는 중요한 도구입니다. 이를 적절히 사용하면 더 효율적이고 안전한 코드를 작성할 수 있습니다.
728x90반응형'프로그래밍 > C & C++' 카테고리의 다른 글
[C++] 제네릭 프로그래밍 (0) 2024.07.05 [C++] 템플릿 (0) 2024.07.05 [C++] 깊은 복사와 얕은 복사 (0) 2024.07.05 [C++] 참조자를 통해 객체의 멤버에 접근 (0) 2024.07.02 [C++] 포인터를 통해 객체의 멤버에 접근 (0) 2024.07.01