티스토리 뷰


item3의 주제는 컨테이너의 객체(혹은 값)를 정확하고 낮은 비용으로 복사하기 입니다.


STL을 사용하는데 있어 핵심으로 알아야할 사안은 값이 복사된다는 사실입니다. (Copy in, Copy out)


이는 다시말해 컨테이너에 존재하는 객체는 그 자체로 유일할 객체가 된다는 사실입니다.


(primitive type은 값 그 자체가 복사 되는점에 있어서 예외)



가령 사용자가 만든 객체 Widget이 있다고 가정합니다.


또 각 객체를 생성해 vector에 push_back한다면 이 때 vector에 들어가는 객체는


복사대입연산이 수행되어 값이 복사되어 들어가게 됩니다.


이러한 개념은 algorithm에서 마찬가지로 작용합니다


sort, reverse, nth_elements와 같은 알고리즘에서 적용될 적에


값이 복사되고 삭제되는 일이 무수히 반복됩니다.


값의 복사는 대게 많은 비용을 요구합니다.


클래스의 구현에 따라 다르지만 그 크기가 몇 mb에 이를수도 있습니다.


이러한 객체를 몇만이상개 복사를 한다고 생각하면 그 시간은


헤아리기 힘들것 같습니다.




따라서 이번 chapter의 주제처럼 STL을 사용하게 되면


필히 동반되는 객체의 복사에 대해서 효율적으로 처리할 필요가 있습니다.


이를 위해서 다음과 같은 방법을 이용해 봅니다.



1. vector에서 reserve를 이용하여 불필요한 객체의 생성을 방지하기.


2. 포인터를 이용한 대입연산호출을 최소화 하기.



우선 다음 소스의 결과를 보면 단번에 위와 같이 따라야 할 이유를 알 수 있습니다.











1의 예제 결과가 어떻게 도출 되었을까요?


우선 34번줄에서 widget()이 호출되었기에 기본생성자가 호출되었습니다.


다음으로 push_back함수에서 reallcation이 일어나면서 값을 새로 복사하는 과정을 거치게 되어


대입연산이 호출되었습니다. (최초에 vector에 공간이 할당되어 있지 않았기때문에 realloc 발생)



다시, 곧바로 2번 예제의 결과를 봅시다.


vector의 생성자로 매개변수 5를 통해 호출하니 기본생성자가 다섯번 호출되었습니다.


이는 vector 생성자 중의 하나를 호출한 결과로 다섯개의 객체가 생성되었기 때문입니다.


다음으로 push_back을 통해 새로운 widget을 넣고있는데 여기서 


여섯번의  대입연산 역시 1번의 이유와 같이 reallocation이 발생했기때문에 일어난 결과입니다.



첫번째 핵심으로 46번에서 이번 주제의 코드가 나옵니다.


[]연산을 호출했더니 덩달아 대입연산이 일어나면서 객체의 복사가 이루어지며 새로운 객체가 myWidghet에 전달 되었습니다.


때문에 stl에서는 값이 왔다갔다하며, 그 과정에서의 연산비용이 만만치 않음을 알 수 있습니다.




3번예제는 "1. vector에서 reserve를 이용하여 불필요한 객체의 생성을 방지하기."와 같이  reserve를 이용했을때 불필요한 객체의 생성을 


막을 수 있음을 알 수 있습니다.




두번째 핵심은 4번의 예제를 통해 알 수 있습니다. 포인터의 주소가 복사될 뿐 값은 포인터가 가르치는 객체의 주소는 


여전히 같음을 알 수있습니다.


(포인터의 주소가 복사되는것은 마치 값이 복사되는 것처럼 주소가 그대로 복사되기 때문에 문제가 없습니다.)




이러한 포인터를 통한 객체전달 방법을 통해 복사대입연산에서 일어나는 비용을 절감할 수 있습니다.


단, 포인터를 할당한만큼 자원관리가 수반되는 번거로움이 따릅니다.


이는 smart pointer인 shared_ptr를 이용하면 손쉽게 자원관리 문제가 해결됩니다.


shared_ptr에 대한 개념이나 사용방법은 별도로 구글에서 찾아보시기 바랍니다.


(auto_ptr를 사용하면 안되는 이유는 item8에 나옵니다.)



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함