작성
·
8
·
수정됨
0
안녕하세요.
이동시멘틱 강의를 보다가 의문이 있어 문의드립니다.
강의에 나오는 CMyString 클래스는 내부 포인터 변수 멤버를 가지고 있는데, CMyString a,b,c;에서 a = b+c;를 실행할 때
CMyString operator+() 함수의 return값의 사본이 임시객체에 저장되고 이 임시객체가 이동생성자의 매개변수에 들어가는 것이 맞을까요?
만약 그렇다면 사본을 가진 임시객체의 포인터 변수 멤버의 값이 return 값의 포인터 변수 멤버의 값과 같을텐데 return 후 return값이 소멸함에도 이동생성자 내부에서 사본은 어떻게 계속 값을 유지하는걸까요?
이동생성자 호출 시에는 이동생성자 종료 전까지 return 값이 사라지지 않는걸까요?
사본이라고 표현하신 것의 의미도 궁금합니다...
사본은 모든게 다 똑같은 복사본인걸까요..?
근데 그러면 참조자와 같은것일것같은데 반환형식이 참조자는 아니고... shallow copy한 것도 아니고 deep copy한 것도 아닌것 같은데...
너무 헷갈리네요...
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
sinid25님, 질문해주셔서 감사합니다.
C++에서 이동 생성자와 이동 시멘틱에 대해 설명드리겠습니다. C++에서 CMyString 클래스를 a = b + c;와 같이 사용할 때, operator+ 함수는 임시 객체를 반환합니다. 이 임시 객체는 이동 생성자의 매개변수로 넘겨질 때 이동 시멘틱이 발생하여 메모리 할당을 최소화하고 효율성을 높일 수 있습니다.
임시 객체의 생성: operator+ 함수가 호출되면 덧셈 결과로 반환되는 CMyString 객체는 임시 객체입니다.
이동 생성자의 동작: a = b + c; 문장에서 b + c는 임시 객체를 반환하고, 이 임시 객체는 a에 대입되기 위해 이동 생성자의 매개변수로 전달됩니다. 이동 생성자는 임시 객체의 자원을 그대로 가져와 현재 객체에 할당하고 임시 객체의 소멸자 호출 시 문제가 발생하지 않도록 임시 객체의 자원 포인터를 nullptr로 초기화하거나 해제에 안전한 상태로 둡니다.
가치의 지속성: 이동 생성자가 호출되는 중에는 임시 객체가 소멸하지 않고, 이동 생성자 완료 후에 소멸됩니다. 따라서, 이동 생성자를 통해 자원이 안전하게 이동됩니다.
‘사본’의 의미: 사본이라는 표현은 임시 객체가 생성되면서 이전 객체의 자원을 복사한 것이 아니라 이동한 것을 의미합니다. 이동은 깊은 복사가 아닌 포인터나 자원 소유권을 넘기는 작업이므로 메모리와 자원을 효율적으로 관리할 수 있습니다.
참조와 차이: 참조자가 아닌 복사나 이동은 새로운 객체를 생성하며, 모든 데이터가 동일하지만, 포인터 참조와는 다르며 필요시 원본 객체는 필요에 따라 자원 소유권을 포기합니다.
이러한 점에서 CMyString 등과 같은 사용자 정의 객체의 이동 시멘틱을 효율적으로 이용할 수 있습니다.
자세한 사항은 Spring Data JDBC Object Mapping Fundamentals를 참고하시면 도움이 될 수 있습니다.
도움이 되었기를 바랍니다! 추가적으로 질문이 있으시면 언제든지 문의주세요.