일지

Effective C++...23

niamdank 2022. 7. 12. 07:47

예외를 던지지 않는 swap에 대한 지원도 생각해 보자

표준 라이브러리 swap의 동작

표준 라이브러리에 있는 swap은 다음과 같이 구현되는데, 한 번 호출에 복사가 세 번 일어난다.


namespace std {

    template<typename T>

    void swap(T& a, T& b)

    {

        T temp(a);

         a = b;

         b = temp;

    }

}


 

일반적으로는 표준 라이브러리의 swap으로 충분하지만 대부분의 멤버가 포인터로 구성되어 있는 경우라면 복사 생성자를 호출하는 대신 포인터가 가리키는 대상만 바꿔주는 편이 더 효율적이므로 이런 경우엔 전용 swap을 구현하는 게 좋다.

 

전용 swap 구현 방법

전용 swap을 구현할 때는 다음과 같은 구현이 필요하다.

  • public 멤버 함수 swap 두 객체의 값을 맞바꾸는 예외를 던지지 않는 함수
  • 같은 네임스페이스의 비멤버 swap 멤버 함수 swap을 호출하는 함수

 

사용자 관점의 swap 함수 사용

사용자가 swap을 호출할 때는 전용 swap이 있으면 그것을 사용하고 그렇지 않으면 표준 라이브러리의 swap을 사용하도록 하려고 할 때 다음과 같이 사용하면 된다.


template<typename T>

void doSomething(T& obj1, T& obj2)

{
   using std::swap;

    ...

    swap(obj1, obj2);

     ...

}


※ 컴파일러는 인자 기반 탐색을 통해 특수화된 함수를 검색하고 없는 경우 using으로 선언된 표준 라이브러리 함수를 사용한다.