개발자 면접 공부/C-C++

(C++) 이동생성자(Move Constructor)

chogyujin 2022. 8. 2. 22:10
728x90

이동 생성자(Move Constructor)에 대해 공부하겠습니다.


이동생성자(Move Constructor)

이동 생성자는 객체가 살아있지만 안 쓴다고 보장할 수 있는 상황일 때 사용하게 되는 코드입니다.

기존 객체의 주소 및 Value값을 새로운 오브젝트에 소유권을 이전하게 하는 생성자로, 기존 객체의 값이 이전됩니다.

 

내부적인 구조로 봤을 때 Test b = static<Test&&>(a) 또는 Test b = move(a)는 새롭게 메모리를 복사할 필요 없이 이전에 잡은 메모리를 가르키기만 하면 되는데 굳이 새롭게 메모리를 잡고 그 메모리에 이전 데이터를 복사해서 저장함

 

그렇기 때문에 이동 생성자가 있고 이동 생성자를 통해 객체를 생성하면 이전에 Heap에 있던 메모리를 새로운 객체가 가리키게 되고 이전에 생성된 객체는 nullptr로 만들어 새로운 공간을 만들지 않고 새로운 객체를 가르키게 됨

즉 전에 있던 객체를 다른 객체에 옳긴뒤(다른 변수에게 이 객체는 여기 주소Heap에 있어 라고 알려주고 자기 자신은 그 주소를 잊어버리는 것 즉 소유를 이전)

 

R-Value Reference를 사용한 예중 하나 이를 사용하면 복사 생성과 같은 Deep Copy를 안해도 됩니다.

 

Test(Test&& other)
{
	cout << "이동 생성자 호출" << endl;
	mData = other.mData;
	mName = other.mName;
    other.mData = NULL;
    other.mName = NULL;
		
}

이동 생성자 기본 식


번외 push_back VS emplace_back

두 함수는 vector 컨테이너가 주었을때 뒤에 한 칸을 늘리고 해당 값을 넣어주는 함수입니다.

하지만 내부적으로는 push_back의 경우 메모리를 이동하거나 임시 객체를 이용하여 임시객체가 생성되고 넣어준 뒤에 임시객체가 삭제되는 호출이 있습니다.

emplace_back은 받은 인수를 이용해 내부에서 생성자를 통해 객체 생성 후 추가를 하기 때문에 임시 객체의 생성, 파괴가 없어서 push_back보다 효율적입니다.

int main()
{
	vector<Test>v;
	v.push_back('a');
	return 0;
}

push_back 생성

int main()
{
	vector<Test>v;
	v.emplace_back('a');
	return 0;
}

emplace_back 생성

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

싱글톤 패턴(SingletonPattern)  (0) 2022.08.04
Struct vs Class  (0) 2022.08.03
(C,C++) L-Value, R-Value  (0) 2022.08.02
C++ 스마트 포인터(Unique, Shared, Weak)  (0) 2022.07.19
C++ 캐스팅의 종류  (0) 2022.07.14