아마 이 키워드는 복사생성자와 이동생성자를 다루면서 들어봤을 것 이다.
복사생성자가 무엇이냐?
일반적으로 클래스를 선언할 때 컴파일러가 내부적으로 자동적으로 만들어준다.
A라는 클래스가 있다면, A(const A& )라는 생성자가 자동으로 만들어진다.
즉, 동일한 클래스의 인스턴스를 받으면 고대로 그 인스턴스가 가진 값을 복사한다.
이 때, 이 자동으로 생성된 생성자가 사용된다면 내부적으로 얕은 복사가 사용이된다.
얕은 복사는 무엇이냐?
만약 A클래스가 메모리가 할당된 부분의 포인터변수를 들고있어야 한다고 가정하자,
그렇다면 이미 만들어진 인스턴스를 복사생성자의 인자로 넣게되면,
원래 존재하던 인스턴스의 포인터 주소를 새롭게 복사된 인스턴스도 포인터가 가리키게 되는것이다.
이미지에서는 왼쪽 부분이 얕은복사를 의미한다.
오른쪽에 있는 것은 깊은복사이다.
깊은복사는 새롭게 만들어진 인스턴스가 메모리를 새롭게 할당해서 값을 복사하는 방식으로,
독립적인 메모리를 가지게 된다.
그래서, 의도한 것이 아니라면, 포인터변수를 할당해서 사용할 때는 복사생성자에서 메모리할당을 하면서 깊은복사를 유도해 주는 것이 안전하다라는 것이다.
왜냐? 같은 메모리 주소를 공유하다가 한쪽이 할당해제를 해버리면, 나머지 한쪽이 그 주소를 쓰려다가 크래쉬가 발생한다.
자, 그럼 이동 생성자가 왜 튀어나왔나?
이동생성자는 무브시맨틱을 이용하여 인스턴스의 우측값을 좌측값으로 만들어 인자로 전달한 후, 자신의 포인터를 얕은복사 시킨 후, nullptr로 밀어버린다.
즉, 포인터변수가 가리키는 주소에 대한 접근권을 유일하도록 만들고 자신의 객체에 들어있는 값들을 더 이상 사용하지 않게된다.
이 때, 이동생성자를 사용하는 이유로는, 만약 복사 대상 인스턴스를 사용하지 않을 것임을 확신하여 이동생성자로 넘겨 줄 경우, 메모리할당을 안하고 다른 객체로 자신의 값 정보를 넘겨줄 수 있다.
[Reference]
'C++' 카테고리의 다른 글
[Idiom] 보편참조와 퍼펙트포워딩 (0) | 2025.02.12 |
---|---|
[Idiom] 언리얼엔진에서 배워온 TypeDispatch (0) | 2025.02.12 |
스마트 포인터, 강참조와 약참조 (0) | 2022.11.26 |
C++ 전방선언 (0) | 2022.11.25 |
빌어먹을 4바이트 가상함수 테이블 포인터 (0) | 2022.11.25 |