cpp(stl)

cpp10 STRING객체(복사/이동)/push_back/emplace_back

yam3u 2025. 5. 24. 23:38

 

STRING( const STRING& other )

복사생성자 

: 객체를 새로 만들 때, 복사를 이용해! (깊은 복사를 한다..)

다른 객체와 똑같은 내용으로... 새로운 객체를 만드는 것.

other.p의 내용을 새로운 p에다가 복사해주는 것.

보다시피..

STRING s2 = s1;

이게 복사 생성자로 s2를 만들어 준것..

 


STRING& operator= ( const STRING& other )

: 복사 할당 (복사 대입)

이미 있는 객체에.. 복사 대입할 때 

이미 존재하는 a에 대해, b의 내용을 복사하는 것..

p.release()로 기존 자원을 해제한다.. make_unique로 새 메모리를 할당 후, memcpy를 통해 내용 복사!

실제 호출은 이런 식으로..


STRING(STRING&& other)

: 이동 생성자

rvalue를 새 객체에 넘길 때...! 

other.p 자원을... release로 반환 시키고 그걸 잽싸게 가져온다.. (p.reset 이용)

other.p는 비워져야함

복사보다 훨 빠르다! (복사를 안하니깐)


STRING& operator= (STRING&& other)

: 이동 대입 (이동할당연산자)

기존 객체에 rvalue를 대입 할 때..!

이미 생성된 객체니까.. 이미 자원을 가지고 있을 수도 있다! 그걸 먼저 해제해줘야함. 

 

 

 

쉽게 말하자면

복사는 정말 복사하는거.. 복제.. 원본, 복사본 모두 존재, 느릴 수 있다.. 복사라는 비용 발생

이동은 훔치는거.. 자원을 그냥 휙~ 하고 가져온다. 원본은 텅 비게 됨.. (소유권을 뺏긴다) 복사를 안하니 빠르다..


push_back vs emplace_back

 

먼저 push_back 부터..

push_back은 일단 만들어진 객체가 필요함.. 

이를 위해.. s라는. 1번객체가 먼저 생성되어야한다.. 이를 생성 후 복사시켜서 vector에 추가시킴.

만약에 만들어진 객체가 없다면.. 위 사진의 1번. 임시객체를 임의로 생성해서 이동시킨다..

객체를 삽입하려고.. 똑같은 임시 객체를 만들고, 복사시켜서 그걸 vector에 집어넣는다.

그리고 삽입이 끝나면 다시 그걸 삭제.. 파괴시킴(1번 소멸자 불림)

 

잠깐 쓰고 버릴 메모리를 굳이 할당하고, 임시 객체 생성자를 호출해 생성 후 삽입 끝나면 소멸시키는.. 불필요한 연산이 생긴다.. => 비효율!!!

 

그러나 emplace_back은..

이렇게.. 바로바로 객체를 내부에서 생성, 삽입한다... 1, 2가 객체 생성..

3번은 vector 용량이 차서 1을 복사해 붙여넣느라 그런 것..... push_back과 다르게 임시객체를 생성하지 않고 

emplace_back은 생성삽입.. 임시객체를 생성하지 않고, 

함수 내부에 원소를 넣을 때 객체가 생성됨. 

 

emplace_back은 템플릿 함수..

push_back은 아니기에.. 인수의 형식과 템플릿 형식이 같지 않기에 push_back("333") 이렇게 했을 때,

push_back(STRING("333"))이렇게.. 명시적으로 타입을 변환시켜서 넣기에 임시 객체가 필요 한 것.. (한번의 생성  복사(또는 이동)생성자 필요)

 

emplace_back("333")은..

"333"이라는 인자를 바로 전달해서 vector안에서 바로 STRING("333")이 생성됨 (-> 임시객체 생성 생략)

직접 생성한다.. (in-place)

 

그러나.. 뭐가 더 효율적인가?에 대한 대답은 어렵다..

물론 emplace_back이 복사/이동 생략, 임시객체가 없다긴 하지만.. 

어떤 상황에서는 push_back이 더 효율적일 수 있당..

 

어쨌든!!! emplace_back은 그 자리에서 생성!!이 핵심. 

근데 뭐... 완성된 객체를 인자로 넘길땐 move()를 써서 이동 생성자를 호출 할 때도 있

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[참고한 사이트..]

 

'cpp(stl)' 카테고리의 다른 글

cpp11 역방향반복자  (0) 2025.05.25
cpp9 STRING객체/list/vector/deque  (1) 2025.05.23
cpp8(callable)  (0) 2025.04.11
cpp7(함수포인터/collable/람다) 4w2  (0) 2025.04.11
cpp6(RAII/throw/unique_ptr) 4w1  (0) 2025.04.08