Wednesday, August 13, 2008

Advanced Generic Handle - Copy On Write

Generic Handle Class는 여러 클래스를 동일하게 다룰 수 있지만 메모리 복사가 많이 일어나는 오버헤드가 있다. Reference Count를 사용한 Generic Handle Class는 값을 항상 참조만 시키기 때문에 s2 = s1 처럼 대입하면 s2의 값을 바꾸었을때 s1의 값이 항상 바뀐다(같은 객체를 참조하니까). 때문에 경우에 따라 참조하고, 경우에 따라 복사를 하는 더 나은 형태의 Generic Handle Class 가 있으면 좋겠다.

즉, s3 = s2 = s1처럼 대입하면 실제 복사는 일어나지 않고 s3, s2가 s1의 레퍼런스만 가지고 있게 하다가, s3에 다른 새로운 값을 대입하거나 내부 멤버를 변경하는 작업이 일어날 때 비로소 s1의 멤버 값들을 복사한 후 s1에 대한 레퍼런스를 끊어 별개의 객체로 동작하게 하는 것이다.

linux memory management의 COW(Copy-On-Write)처럼 변경 사항이 일어날 때 비로소 복사를 하는 것이다.

실제 이러한 클래스를 구현하는 방법은 기존의 Reference Count를 사용하는 Generic Handle Class에 아래와 같이 reference count를 체크한 후 복사를 진행하는 멤버 함수를 추가한 후, 멤버를 변경시키는 함수 호출시 이 멤버함수를 실행시키면 된다.


template class Ptr {
public:
void make_uniue() {
if (*refptr != 1) {
--*refptr;
refptr = new size_t(1);
p = p ? p->clone() : 0;
}
}
...

No comments:

Post a Comment