모던 C++ 코드를 보다 보면 std::move가 여기저기 나오는데 개념이 잘 안 잡혀요. 이동 시맨틱(move semantics)이 복사보다 빠르다는데, 데이터를 옮기는 거나 복사하는 거나 결국 값이 넘어가는 건 똑같지 않나 싶어서요.
예를 들어 이런 코드가 있을 때요.
std::vector<int> a(1000000);
std::vector<int> b = a; // 복사
std::vector<int> c = std::move(a); // 이동
b는 백만 개를 통째로 복사하니까 오래 걸린다는 건 알겠는데, c는 왜 빠른 건가요? 안에 있는 원소들을 안 옮기고 그냥 넘긴다는 게 무슨 뜻인지 잘 모르겠어요. 포인터만 바꿔치기하는 느낌인가요?
그리고 std::move(a) 하고 나면 원래 a는 어떻게 되는 건가요? 비워지는 건지, 쓰면 안 되는 건지 헷갈립니다. 언제 move를 써야 이득이고 언제는 굳이 안 써도 되는지도 알려주시면 감사하겠습니다.