항목11 - operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자!
operator= 에서는 자기대입에 대한 처리가 빠지지 않도록 하자!
자기대입이란(self assignment)?
어떤 객체가 자기 자신에 대해 대입연산자를 적용하는 것을 말함
w = w;
a[i] = a[j];
*px = *py;
같은 값을 같거나 같은 값을 가르키면 그것은 자기대입이 성립됨.
자기대입이 생기는 이유는 여러 곳에서 하나의 객체를 참조하는 상태인 '중복참조(aliasing)' 라고 불리는 것 때문!
자기대입이 안좋은 이유
- 코드가 커짐
- 처리 흐름에 분기점을 만들어 실행속도 느려짐
- CPU 명령어 선행인출, 캐시, 파이프러닝 등의 효과 떨어짐
해결책
- ' 옮긴 후 삭제! '
1. 원래의 포인터변수 pb를 어딘가에 저장한다. Bitmap *pOrig = pb;
2. pb 가 *pb의 사본을 가리키게 한다. pb = new Bitmap(*rhs.pb);
3. 원래의 pb를 삭제한다. delete pOrig;
- > new Bitmap 부분에서 예외가 발생하더라도 pb는 변경되지 않은 상태가 유지되어 예외에서 안전하다.
- '복사 후 맞바꾸기(copy and swap)'
1. temp = 사본의 copy를 하나 만들고 그것을 원본과 스왑하는 기법
-> 클래스의 복사 대입 연산자는 인자를 값으로 취하도록선언하는 것이 가능하다는 점
-> 값에 의한 전달을 수행하면 전달된 대상의 사본이 생긴다는 점
잊지말자!
- operator= 을 구현할 때, 어떤 객체가 그 자신에 대입되는 경우를 제대로 처리하도록 만듭시다.
원본 객체와 복사대상 객체의 주소를 비교해도 되고, 문장의 순서를 적절히 조정할 수도 있으며, 복사 후 맞바꾸기 기법을 써도 된다!
- 두 개 이상의 객체에 대해 동작하는 함수가 있다면, 이 함수에 넘겨지는 객체들이 사실 같은 객체인 경우에 정확하게 동작하는지 확인해 보자!
댓글을 작성해보세요.