2015년 6월 8일 월요일

[C++11] 이동 시맨틱

기존 C++의 성능(주로 STL)을 개선하기 위해 도입된 개념입니다. vector를 예로 들자면 기존 C++의 경우 계속 항목을 추가하다 보면 공간이 부족해지고 공간을 늘리기 위해 다음 절차를 수행합니다.
1. 이전보다 큰 메모리 공간을 할당한다.
2. 기존 영역의 항목을 모두 복사한다.
3. 복사가 끝나면 기존 영역의 메모리를 해제한다.
깊은 복사가 일어나기 때문에 매우 비효율적입니다.

이 런 비효율을 극복하기 위해 C++11에서는 전에 언급한 R-Value 레퍼런스를 이용해 이동 시맨틱을 구현했습니다. vector 내부의 구현을 보면 기존에 메모리를 복사하는 부분이 메모리를 이동하는 것으로 바뀐것을 알수 있습니다. 따라서 vector 공간이 늘어나도 수행 시간이 거의 소요되지 않습니다. vector 뿐만 아니라 기타 다른 STL도 이런 식으로 구현이 변경되었습니다. 전체적으로 성능이 많이 향상되었겠죠?
std::vector<int> vec1;
std::vector<int> vec2;

vec1.push_back(1);
vec1.push_back(2);

vec2 = std::move(vec1); // 이동 시맨틱을 지원하기 위해 추가된 함수입니다. 객체를 
    // 복사하지 않고 이동합니다.

PS. 임베디드 리눅스에서 C프로그래밍을 주업무로 하는 저로써는 이런거 구현안하고 메모리 포인터만 넘겨주는게 훨씬 편할것 같습니다. 어차피 객체 소유권 이전도 내부적으로 보면 메모리 포인터 변경이니까요. 소유권 이전하면 기존 객체는 사용 못하고... 참조와 템플릿을 주로 사용하는 C++ 입장에서 보면 저런 개념이 필요할것 같긴 합니다.
조작을 위해 기존 객체를 새로 복사해서 쓰는 경우가 많은데 기존 객체도 유지되고 동일한 새로운 객체도 생성되는데 수행 시간이 0이라면? +_+ (불가능하겠죠?)

댓글 없음:

댓글 쓰기