2015년 10월 14일 수요일

[C++][Android] object copy


객체 복사(Object copy)

Android 에서는 객체 복사를 위해 아래 3가지 방법을 지원한다.
1) sp(strong pointer) : reference counting(참조 계수) 기반
2) wp(weak pointer) : reference counting 을 하지 않는 pointer (C++ 표준)
3) uniquePtr : 복사 금지에 사용하는 pointer




위 코드는 default 복사 생성자가 호출되어 얕은 복사가 진행된다.
하지만 main 함수가 종료될 때, p1의 소멸자가 호출되면서 "kkk"에 대한 메모리가 해제되는데,
p2에서 다시 해제하려고 하기 때문에 에러가 발생한다.

객체를 복사하는 기법
1) 깊은 복사(Deep copy)

Person class에서 복사 생성자를 정의하여 깊은 복사를 하도록 했다.
하지만 대부분의 open source에서는 이와 같은 깊은 복사를 진행하지 않는다.
복사 생성자 호출 시 내부적으로 메모리 동적 할당을 시도하기 때문에 비용이 높고 성능에 영향을 미친다.


객체를 복사하는 기법
2) 소유권 이전

소유권 이전 방식은 언제 필요한가?
e.g, swap

일반적으로 swap 은 source, target, temp 3개의 객체가 서로 복사되는 overhead가 발생한다.
그래서 얕은 복사로 진행하여 성능을 향상 시킬 수 있다.
소유권 이전 방식은 C++에서 표준으로 채택하였으며,
C++11 에서는 move 생성자를 지원하기도 한다.
하지만 소유권 이전 방식은 성능에 약간의 향상을 얻을 수 있지만 Android 는 이 방식을 사용하지 않는다.

객체를 복사하는 기법
3) Reference counting(참조 계수)

참조 계수 방식은 기본적으로 얕은 복사를 진행하나,
Reference counting 을 증가/감소시킴으로써
실제 참조하는 object 가 없을 때, 소멸되도록 하는 방식이다.

객체를 복사하는 기법
4) 복사 금지

참조 계수를 이용하는 것 조차 성능상에 문제가 발생할 수 있는 경우는,
복사 생성자와 대입연산자를 private 영역에 선언함으로써
아예 복사 자체를 금지하게 하는 방법도 있다.

Android Framework에서는 SP(Strong Pointer), WP(Weak Pointer) 는 참조계수 방식으로
UniquePtr 은 복사금지 방법으로 제공한다.






댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...