Move semantics는 C++의 메커니즘으로, 객체 간에 자원을 복사하는 대신 효율적으로 이동할 수 있게 해줍니다. C++11의 등장으로 이동 생성자와 할당 연산자가 도입되어 객체가 자원을 다른 객체로 이동할 수 있게 하여 복사 비용을 절감합니다.
std::move는 전달된 객체를 rvalue 참조로 변환하여 자원을 안전하게 이동할 수 있음을 나타냅니다. std::forward는 템플릿에서 더 전달할 때 값의 유형 (lvalue/rvalue)을 유지하는 데 사용됩니다.
#include <string> #include <vector> #include <iostream> std::vector<std::string> getNames() { std::vector<std::string> v = {"Alice", "Bob", "Charlie"}; return v; // 여기서 move semantics가 작동합니다 } int main() { std::vector<std::string> names = getNames(); // 여기서 getNames()의 내용이 불필요한 복사 없이 이동됩니다 }
std::move와 이동 생성자의 차이는 무엇입니까? std::move를 쓰면 객체가 항상 이동됩니까?
답변:
std::move는 단순히 rvalue 참조로 캐스팅할 뿐이며, 스스로 이동을 수행하지 않습니다. 이동 연산은 실제로 이동 생성자/연산자가 구현되어 있을 때만 발생합니다. 그렇지 않으면 복사가 발생합니다.
struct A { A() = default; // 이동 생성자가 없음 A(const A&) { std::cout << "복사! "; } }; A a1; A a2 = std::move(a1); // 복사가 호출되며 이동되지 않음
이야기
이야기
이야기