반응형
std::move(tmp) 사용 후 tmp가 사라지면 문제가 없을까?
👉 결론: 전혀 문제없음!
이유는 std::move(tmp)를 통해 set.insert()가 tmp의 데이터를 이동하여 저장하기 때문!
✅ 1️⃣ std::move(tmp)가 실제로 하는 일
std::move(tmp)를 하면 tmp의 내부 버퍼(포인터)를 set이 소유하게 되고, tmp는 비어있는 상태가 됨.
즉, set.insert(std::move(tmp))을 하면 다음이 일어남:
- std::move(tmp)가 tmp를 우측값(rvalue)으로 변환
- std::string의 이동 생성자(move constructor)가 호출됨
- set 내부의 노드가 tmp의 문자열 버퍼를 가져감
- 이후 tmp는 비어 있는 상태가 됨 (길이 0, 메모리 해제되거나 재사용)
즉, set이 tmp의 데이터를 가져가므로 tmp가 사라져도 문제 없음! 🚀
✅ 2️⃣ 루프를 벗어나면 tmp가 없어지는데도 괜찮은 이유
🔹 예제 코드
#include <iostream>
#include <set>
#include <string>
int main() {
std::set<std::string> mySet;
for (int i = 0; i < 3; i++) {
std::string tmp = "Hello World " + std::to_string(i);
mySet.insert(std::move(tmp)); // tmp의 데이터가 이동됨
std::cout << "After move, tmp: " << tmp << std::endl; // tmp는 비어있음
}
std::cout << "Set contents:\n";
for (const auto& s : mySet) {
std::cout << s << std::endl; // 데이터가 잘 저장됨
}
return 0;
}
🔹 실행 결과
After move, tmp:
After move, tmp:
After move, tmp:
Set contents:
Hello World 0
Hello World 1
Hello World 2
✅ set이 데이터를 잘 저장했지만, tmp는 move 후 비어 있음!
👉 즉, 루프를 벗어나서 tmp가 삭제되어도 set에는 정상적으로 남아 있음.
✅ 3️⃣ std::move(tmp)와 set.insert(tmp) 차이
방식 | 동작 | 결과 |
set.insert(tmp) | tmp의 데이터를 새로 복사하여 set에 저장 | 느림 (O(N)) |
set.insert(std::move(tmp)) | tmp의 내부 버퍼를 그대로 이동하여 set에 저장 | 빠름 (O(1)) |
👉 tmp가 소멸해도 set이 데이터를 안전하게 보관하므로 문제 없음! 🚀
✅ 4️⃣ 최종 결론
✅ std::move(tmp)는 단순히 포인터를 이동시키는 역할이므로, tmp가 루프 종료 후 삭제되어도 set 내부 데이터에는 영향 없음!
✅ 반대로, std::move를 사용하지 않으면 tmp가 복사되므로 성능이 저하됨.
✅ 즉, std::move(tmp)를 사용해도 set에 안전하게 저장됨. 🚀
반응형
'다양한 TIP' 카테고리의 다른 글
워드프레스 태그 제대로 쓰는 법! 🔍 검색 노출을 높이는 비결 (1) | 2025.03.08 |
---|---|
Virtualbox 마우스 전환하는 방법(마우스 탈출) (0) | 2025.03.07 |
비 오는 날에도 OK! 실내 테니스 즐기는 법 & 필수 장비 소개 🏆 (0) | 2025.03.06 |
댓글